Musisz użyć ParseExact
metody . Jako drugi argument przyjmuje ciąg znaków, który określa format daty i godziny, na przykład:
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);
}
Jeśli użytkownik może określić format w interfejsie użytkownika, musisz przetłumaczyć go na ciąg, który możesz przekazać do tej metody. Można to zrobić albo poprzez umożliwienie użytkownikowi wprowadzić bezpośrednio ciąg formatu - choć oznacza to, że konwersja jest bardziej podatne na uszkodzenia, ponieważ będzie wprowadzić nieprawidłowy ciąg formatu - lub posiadające pole kombi, który przedstawia je z możliwych wyborów, a ty ustaw ciągi formatujące dla tych wyborów.
Jeśli prawdopodobne jest, że dane wejściowe będą nieprawidłowe (na przykład dane wejściowe użytkownika), lepiej byłoby użyć TryParseExact
zamiast używać wyjątków do obsługi przypadku błędu:
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);
}
Lepszą alternatywą może być nie prezentowanie użytkownikowi wyboru formatów daty, ale użycie przeciążenia, które pobiera tablicę formatów :
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);
}
Jeśli odczytujesz możliwe formaty z pliku konfiguracyjnego lub bazy danych, możesz je dodać, gdy napotkasz różne sposoby wprowadzania dat.
TryParse
. To znaczybool success = DateTime.TryParse(...);
.