Вам потрібно скористатися ParseExact
методом . Це приймає рядок як другий аргумент, який вказує формат, в якому знаходиться час, наприклад:
dateString = "2011-29-01 12:00 am";
format = "yyyy-dd-MM h:mm tt";
try
{
result = DateTime.ParseExact(dateString, format, provider);
Console.WriteLine("{0} converts to {1}.", dateString, result.ToString());
}
catch (FormatException)
{
Console.WriteLine("{0} is not in the correct format.", dateString);
}
Якщо користувач може вказати формат в інтерфейсі, то вам потрібно перевести його в рядок, який ви можете передати в цей метод. Ви можете зробити це, або дозволяючи користувачеві ввести рядок форматування безпосередньо - хоча це означає , що перетворення є більш ймовірно, зазнає невдачі , оскільки вони будуть ввести невірний формат рядка - або мати з списком , який представляє їх з можливими виборами , і ви налаштуйте рядки формату для цих варіантів.
Якщо існує ймовірність того, що введення буде неправильним (наприклад, введення користувачем), було б краще використовувати, TryParseExact
а не використовувати винятки для обробки випадку помилки:
dateString = "2011-29-01 12:00 am";
format = "yyyy-dd-MM h:mm tt";
DateTime result;
if (DateTime.TryParseExact(dateString, format, provider, DateTimeStyles.None, out result))
{
Console.WriteLine("{0} converts to {1}.", dateString, result.ToString());
}
else
{
Console.WriteLine("{0} is not in the correct format.", dateString);
}
Кращою альтернативою може бути не надання користувачеві вибору форматів дат, а використання перевантаження, яке приймає масив форматів :
string[] formats= {"M/d/yyyy h:mm:ss tt", "M/d/yyyy h:mm tt",
"MM/dd/yyyy hh:mm:ss", "M/d/yyyy h:mm:ss",
"M/d/yyyy hh:mm tt", "M/d/yyyy hh tt",
"M/d/yyyy h:mm", "M/d/yyyy h:mm",
"MM/dd/yyyy hh:mm", "M/dd/yyyy hh:mm",
"MM/d/yyyy HH:mm:ss.ffffff" };
string dateString;
try
{
dateValue = DateTime.ParseExact(dateString, formats,
new CultureInfo("en-US"),
DateTimeStyles.None);
Console.WriteLine("Converted '{0}' to {1}.", dateString, dateValue);
}
catch (FormatException)
{
Console.WriteLine("Unable to convert '{0}' to a date.", dateString);
}
Якщо ви читаєте можливі формати з конфігураційного файлу або бази даних, то можете додати їх до них, коли стикаєтесь із різними способами, якими люди хочуть вводити дати.
TryParse
. Тобтоbool success = DateTime.TryParse(...);
.