Подтвердить что ты не робот

Почему DateTime.ParseExact() не может анализировать "9/1/2009" с использованием "M/d/yyyy"

У меня есть строка, которая выглядит так: "9/1/2009". Я хочу преобразовать его в объект DateTime (используя С#).

Это работает:

DateTime.Parse("9/1/2009", new CultureInfo("en-US"));

Но я не понимаю, почему это не работает:

DateTime.ParseExact("9/1/2009", "M/d/yyyy", null);

Нет слова в дате (например, "Сентябрь" ), и я знаю конкретный формат, поэтому я бы предпочел использовать ParseExact (и я не понимаю, почему CultureInfo понадобится). Но я продолжаю получать страшное исключение "String не было признано действительным DateTime".

Спасибо

Небольшое продолжение. Вот три подхода, которые работают:

DateTime.ParseExact("9/1/2009", "M'/'d'/'yyyy", null);
DateTime.ParseExact("9/1/2009", "M/d/yyyy", CultureInfo.InvariantCulture);
DateTime.Parse("9/1/2009", new CultureInfo("en-US"));

И вот 3, которые не работают:

DateTime.ParseExact("9/1/2009", "M/d/yyyy", CultureInfo.CurrentCulture);
DateTime.ParseExact("9/1/2009", "M/d/yyyy", new CultureInfo("en-US"));
DateTime.ParseExact("9/1/2009", "M/d/yyyy", null);

Итак, Parse() работает с "en-US", но не ParseExact... Неожиданно?

4b9b3361

Ответ 1

Я подозреваю, что проблема - это косые черты в строке формата и те, которые содержатся в данных. Этот символ разделителя даты в культуре в строке формата, а конечный аргумент null означает "использовать текущую культуру". Если вы либо избежите косых черт ( "M" / "d" / "yyyy" ), либо укажите CultureInfo.InvariantCulture, все будет в порядке.

Если кому-то интересно воспроизвести это:

// Works
DateTime dt = DateTime.ParseExact("9/1/2009", "M'/'d'/'yyyy", 
                                  new CultureInfo("de-DE"));

// Works
DateTime dt = DateTime.ParseExact("9/1/2009", "M/d/yyyy", 
                                  new CultureInfo("en-US"));

// Works
DateTime dt = DateTime.ParseExact("9/1/2009", "M/d/yyyy", 
                                  CultureInfo.InvariantCulture);

// Fails
DateTime dt = DateTime.ParseExact("9/1/2009", "M/d/yyyy", 
                                  new CultureInfo("de-DE"));

Ответ 2

Бьюсь об заклад, ваша компьютерная культура не является "en-US". Из документация:

Если поставщик является пустой ссылкой (Nothing в Visual Basic), используется текущая культура.

Если ваша текущая культура не является "en-US", это объясняет, почему она работает для меня, но не работает для вас. и работает, когда вы явно указываете, что культура должна быть "en- США".

Ответ 3

Попробуйте

Date.ParseExact("9/1/2009", "M/d/yyyy", new CultureInfo("en-US"))

Ответ 4

попробуйте это

provider = new CultureInfo("en-US");
DateTime.ParseExact("9/1/2009", "M/d/yyyy", provider);

Bye.

Ответ 5

Я попробовал его на XP, и он не работает, если на ПК установлено значение International time yyyy-M-d. Поместите точку останова на строку и перед ее обработкой измените строку даты, чтобы использовать "-" вместо "/", и вы обнаружите, что она работает. Неважно, есть ли у вас CultureInfo или нет. Кажется странным, что можно указать экспериментальный формат только для того, чтобы игнорировать разделитель.

Ответ 6

Попробуйте:

Настроить в файле веб-конфигурации

<system.web> <globalization culture="ja-JP" uiCulture="zh-HK" /> </system.web>

например: DateTime dt = DateTime.ParseExact( "08/21/2013", "MM/dd/yyyy", null);

ref url: http://support.microsoft.com/kb/306162/

Ответ 7

Установите свойство DateTimePicker Format в пользовательский и CustomFormat prperty на M/dd/yyyy.