Почему 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... Неожиданно?
Ответы
Ответ 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
.