2014-02-20 2 views
0

Я хочу преобразовать строку в формат даты и времени. Дело в том, что строка поставляется в разных форматах. Например, в приведенном ниже коде strDate может быть «2/20/2014 1:41:57 PM» или «20/02/2014 13:44:56». Convert.ToDateTime (strDate) отлично работает только для одного формата (в настройках браузера пользователя) и генерирует ошибку для другого. Как я могу успешно преобразовать строку в datetime независимо от формата строки? БлагодаряПреобразование строк в datetime независимо от формата строки

DateTime dt = Convert.ToDateTime(strDate); 
+1

Невозможно автоматически определить, какая дата «2/5/2014 13:14:15» представляет. Это вторая из пятого февраля? – M4N

+0

Вам действительно нужно иметь некоторую культуру, чтобы начать с преобразования строки в дату. В противном случае, как указано в @ M4N, вы получите неоднозначные результаты. –

+0

Правильно. На самом деле я знаю формат исходной строки. Поэтому, используя TryParseExact, предложенный Habib, я мог бы успешно его преобразовать. Спасибо – user2974961

ответ

2

Вы можете использовать DateTime.TryParseExact или Datetime.ParseExact с множеством форматов, таких как:

string dateStr = "20/02/2014 1:41:57 PM"; 
string[] dateFormats = new[] 
    { 

     "d/M/yyyy h:mm:ss tt", 
     "M/d/yyyy h:mm:ss tt", 
    }; 

DateTime dt; 

if (DateTime.TryParseExact(dateStr, 
          dateFormats, 
          CultureInfo.InvariantCulture, 
          DateTimeStyles.None, 
          out dt)) 
{ 
    //valid dates for formats 
} 
else 
{ 
    //invalid date 
} 

проблема такого подхода заключается в том, что он даст вам противоречивые результаты со строками как 10/02/2014 1:41:57 PM, приведенный выше код будет разобрать его как 10 февраля 2014 года , а не как October 2nd 2014, чтобы избежать этого, вы можете настроить свою клиентскую сторону для возврата даты в определенном формате, а затем проанализировать соответственно.

+1

Отлично. Используя этот код, я смог решить свою проблему. На самом деле у меня есть способ определить формат, который будет использоваться для строки, поэтому, используя этот метод синтаксического анализа, он успешно выполняет синтаксический анализ. Благодаря! – user2974961

+0

@ user2974961, приветствую :) Я думаю, что вы выбрали принятый ответ дважды: P – Habib

+0

сейчас я выбрал этот ответ. дайте мне знать, если это не нормально. – user2974961

0

вы хотите DateTime.Parse() или DateTime.TryParse()

т.е.

DateTime dt; 
if(DateTime.TryParse(stringDate, out dt) 
{ 
    //successful datetime conversion 
} 

, если вы знаете, что строка будет один из нескольких точных форматов, вы можете использовать DateTime.TryParseExact() и передать массив строк из каждый формат (вторая перегрузка).

+0

спасибо за ваш ответ. Я пробовал свой код, но он не разбирает оба формата, а только один. Разница в том, что вместо того, чтобы бросать исключение, он не вводит if. Но он все еще не создает объект datetime, который мне нужен. Мне бы не хотелось идти со строковым массивом или с каждым форматом, потому что я не знаю всех форматов, которые придут. Этого может быть много. спасибо – user2974961

+0

Просто коррекция ... Я могу определить формат строки, поэтому с использованием метода tryparseexact. Благодаря! – user2974961

Смежные вопросы