2015-08-26 4 views
-2

У меня есть метод, который синтаксический анализ строки датыКак преобразовать строку даты в объект DateTime в C#?

public static DateTime ParseDateTime(string dateString) 
{ 
     DateTime dateTime; 
     if (!DateTime.TryParse(dateString, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out dateTime)) 
     { 
      try 
      { 
       dateTime = DateTime.Parse(dateString, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal); 
      } 
      catch (FormatException) 
      { 
       ... 
      } 

     dateTime = dateTime.ToUniversalTime(); 
     return dateTime; 
} 

Но на входе я могу иметь различные форматы, например, если я изменить формат даты d/MM/yyyy (Австралия и Соединенное Королевство локалей) в моей GUI, то я буду имеют System.FormatException Additional information: String was not recognized as a valid DateTime.

Как я могу справиться с обеими ситуациями?

ответ

3

Вам необходимо использовать метод ParseExact вместо Parse и предоставить строку формата в соответствии с используемым вами форматом.

Если вам нужно обрабатывать несколько форматов одновременно, вы можете указать несколько форматов в массиве formats[].

+0

Можете ли вы предоставить код? Я не знаю, как я могу поместить несколько форматов в метод DateTime.ParseExact()? – Anatoly

+0

Были ли у вас взгляды на содержание ссылки, которую я опубликовал? В конце статьи есть пример. –

+0

Да, в MSDN все форматы начинаются с буквы 'M', но в дереве Соединенного Королевства находится' d/MM/yyyy'. Где я могу найти список всех форматов? – Anatoly

1

Учитывая, что вы знаете текущую культуру, вы можете использовать это:

DateTime.Parse(dateString, new System.Globalization.CultureInfo(System.Globalization.CultureInfo.CurrentCulture.Name, false)); 
2

Вы можете попробовать так:

DateTime d1 = DateTime.ParseExact("2015-08-26 10:34:50,431", "yyyy-MM-dd HH:mm:ss,fff",                         
       System.Globalization.CultureInfo.InvariantCulture) 

Заканчивать DateTime.ParseExact Method для деталей.

+0

Но я не знаю, какой тип ввода у меня будет (в США или в Великобритании) – Anatoly

1

Для этого необходимо использовать DateTime.ParseExact. В следующей версии:

public static DateTime ParseExact(
    string s, 
    string[] formats, 
    IFormatProvider provider, 
    DateTimeStyles style 
) 

который

Преобразует заданное строковое представление даты и времени ее DateTime эквивалентной с помощью указанного массива форматов, культуры конкретной информации о формате, и стиль. Формат строкового представления должен соответствовать точно одному из указанных форматов или генерируется исключение.

Таким образом, при условии, что вы точно знаете возможные форматы дат, этот пользователь войдет, вы можете поймать их всех этим методом. ' Для получения более подробного объяснения этого метода, пожалуйста, посмотрите here .