DateTime.Parse создает исключение FormatException независимо от CultureInfo - PullRequest
0 голосов
/ 15 мая 2018

На моем аппарате настроен европейский формат даты: dd/MM/yyyy

При запуске любой из следующих строк:

DateTime.Parse("11/15/2017 12:00:00 AM");
DateTime.Parse("11/15/2017 12:00:00 AM", CultureInfo.CreateSpecificCulture("en-US"));
DateTime.Parse("11/15/2017 12:00:00 AM", CultureInfo.CreateSpecificCulture("fr-FR"));
DateTime.Parse("11/15/2017 12:00:00 AM", CultureInfo.CreateSpecificCulture("en-GB"));

Я получаю

System.FormatException: строка не была распознана как действительный DateTime.

Почему никакая информация о культуре не позволяет мне анализировать эту дату?Я знаю, в какой культуре изначально была создана строка (с использованием DateTime.ToString()), но это все, поэтому я не хочу использовать ParseExact, если только не существует API для получения строки формата по умолчанию для каждой культуры.

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Это работает на машине, где шаблон даты был оставлен по умолчанию:

var culture = CultureInfo.CreateSpecificCulture("en-US");
Console.WriteLine(culture.DateTimeFormat.ShortDatePattern);
Console.WriteLine(culture.DateTimeFormat.ShortTimePattern);
var date = DateTime.Parse("11/15/2017 12:00:00 AM", culture);
Console.WriteLine(date);

Шаблон даты по умолчанию для en-US - "M/d/yyyy", а шаблон времени - "h:mm tt".

Это справедливо, если вы не измените системные настройки для текущей культуры, и эта культура является en-US.

Если вы хотите обойти пользовательские настройки, создайте new CultureInfo("en-US", false).

0 голосов
/ 15 мая 2018

Как вы упомянули, вы настроили dd/MM/yyyy

, таким образом, "11/15/2017 12:00:00 AM" недопустимо. Должно быть:

"15/11/2017 12:00:00 AM"`

В качестве хорошей практики лучше использовать ParseExact, где вы можете указать формат входной строки. Попробуйте:

DateTime.ParseExact("11/15/2017 12:00:00 AM", "MM/dd/yyyy", System.Globalization.CultureInfo.GetCultureInfo("en-US"));
...