Моя машина настроена с европейским форматом даты: 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: String was not recognized as a valid DateTime.
Почему никакая информация о культуре не позволяет мне разобрать эту дату? Я знаю, в какой культуре изначально была создана строка (с использованием DateTime.ToString()), но это все, поэтому я не хочу использовать ParseExact, если нет какого-либо API для получения строки формата по умолчанию для каждой культуры.
Ваша вторая строка отлично работает для меня (в то время как первая выдает исключение, как и должно).
Если у вас уже есть DateTime, почему вы разбираете его на строку, а затем обратно на DateTime?
@TJWolschon У меня это как DateTime в другом приложении, которое не меняет свой контракт
@ DanielA.White, что с ним? предоставляет ли он фактическую строку формата?
А какова ваша изначальная культура (Thread.CurrentThread.CurrentCulture), это "en-US"?
@Evk, да, это "en-US", в целях тестирования, если я создам строку на своей машине, не будет ошибки синтаксического анализа.
Тогда DateTime.Parse("11/15/2017 12:00:00 AM", new CultureInfo("en-us", false)); должен помочь.





Как вы упомянули, вы настроены с помощью 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"));
Ну разве не для этого нужна информация о культуре?
Это формат моей машины, если я изменю свою машину на использование MM/dd/yyyy, исключение не возникнет, почему машину нельзя переопределить?
Это работает на машине, где шаблон даты был оставлен по умолчанию:
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».
Это верно до тех пор, пока вы не измените настройки системы для текущего языка и региональных параметров, и этот язык не является американским.
Если вы хотите обойти индивидуальные настройки, создайте new CultureInfo("en-US", false).
вы пробовали использовать
GetCultureInfo?