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