Невозможно проанализировать DateTime из строки - PullRequest
0 голосов
/ 21 октября 2011
string dt = "10/25/2010 11:40:05 PM";
var currentThread = Thread.CurrentThread.CurrentCulture; //ru-RU
DateTime dateTime = DateTime.Parse(dt); //Exception!

Как разобрать, что dt?

ОБНОВЛЕНИЕ: В моем случае DateTime может быть представлен как "25.10.2010 11:40:05" или "10/25/2010 11:40:05 PM" Это какой-нибудь "универсальный" методразобрать его без изменения CurrentCulture?

Ответы [ 6 ]

5 голосов
/ 21 октября 2011

Используйте пользовательскую строку формата даты и времени, используя ParseExact или TryParseExact.

DateTime dateTime;
DateTime.TryParseExact(
                       dt, 
                       "MM/dd/yyyy hh:mm:ss tt", 
                       CultureInfo.InvariantCulture,
                       DateTimeStyles.None,
                       out dateTime
                      );

Строка не может быть проанализирована как русское представление DateTime, так как русская культура не использует AM / PM, следовательно, используется CultureInfo.InvariantCulture, который похож на культуру США (она не представляет никакой конкретной культуры, но смоделировано по аналогии с США).

2 голосов
/ 21 октября 2011

Попробуйте использовать ParseExact вместо:

DateTime myDate = DateTime.ParseExact("10/25/2010 11:40:05 PM", "MM/dd/yyyy hh:mm:ss tt", CultureInfo.InvariantCulture);
1 голос
/ 21 октября 2011

Россия не использует AM и PM в качестве своих обозначений AM / PM, что является, по крайней мере, одной причиной, которая потерпит неудачу.Другое - то, что Россия, насколько я знаю, может не использовать формат «месяц / день / год», который в основном является особенностью США.(Я не могу вспомнить строки форматирования в России, я помню, что названия месяцев родительного падежа недавно вызвали у меня горе, но это другая история ...)

Я бы лично явно уточнилкультура как инвариантная культура, а также явно укажите строку формата:

string text = "10/25/2010 11:40:05 PM";
string pattern = "MM/dd/yyyy hh:mm:ss tt";
DateTime dt = DateTime.ParseExact(text, pattern,
                                  CultureInfo.InvariantCulture);

Если это может разумно ожидать сбоя, вы должны использовать DateTime.TryParseExactвместо этого, чтобы обработать отказ изящно, не включая исключения.

1 голос
/ 21 октября 2011
var result = DateTime.ParseExact(dt, 
                                 "MM/dd/yyyy hh:mm:ss tt", 
                                 CultureInfo.InvariantCulture);

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

1 голос
/ 21 октября 2011

Попробуйте DateTime.Parse(dt, CultureInfo.GetCultureInfo("EN-us"))

0 голосов
/ 21 октября 2011

Попробуйте что-то вроде этого:

dateTime = DateTime.Parse(dt, CultureInfo.CreateSpecificCulture("en-US"));
...