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


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

это работает:

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

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

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

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

спасибо

немного последующих. Вот 3 подхода, которые работают:

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... Неожиданно?

7 55

7 ответов:

Я подозреваю, что проблема заключается в косых чертах в строке формата по сравнению с теми, в данных. Это символ разделителя даты с учетом языка и региональных параметров в строке формата, а последний аргумент -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"));

держу пари, что культура вашей машины не "en-US". От документация:

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

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

попробовать

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

попробуй такое

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

тю.

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

попробуй :

настройка в файле web config

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

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

ссылка url:http://support.microsoft.com/kb/306162/

установить свойство формат datetimepicker для того, чтобы таможня и CustomFormat prperty to M/dd/yyyy.