Странное поведение Convert.ToDateTime - PullRequest
2 голосов
/ 05 августа 2011

Почему Convert.ToDateTime ведет себя странно при следующих значениях?

Следующее работает просто отлично:

var value = "08/01/2011";
var dateTime = Convert.ToDateTime(value);

Результат: {08/01/2011 00:00:00} --- что просто ожидается.

Но теперь, когда я делаю это:

var value = "07/21/2011";
var dateTime = Convert.ToDateTime(value);

, я получаю исключение:

'Convert.ToDateTime("07/21/2011")' threw an exception of type 'System.FormatException'

Ответы [ 2 ]

6 голосов
/ 05 августа 2011
"07/21/2011";

Это недопустимая дата, поскольку 21 будет интерпретироваться как месяц.

Попробуйте вместо этого явно указать формат:

DateTime myDate = DateTime.ParseExact("07/21/2011", "MM/dd/yyyy", 
                                      CultureInfo.InvariantCulture);

Редактировать:

Согласен с комментарием @ dtb - я просто не смог найти культуру, в которой указанная вами дата является законной.Но общая форма такова:

DateTime myDate = Convert.ToDateTime("07/21/2011", new CultureInfo("XXX"))

, где XXX - это название культуры, которую вы хотите использовать (т. Е. "En-GB" - которая не будет работать с этим форматом)

2 голосов
/ 05 августа 2011

Строки даты / времени анализируются в соответствии с настройками культуры для текущего потока (что определяется региональными настройками, установленными на панели управления Windows).

Например, если текущая культура fr-FR или en-GB , тогда ввод ожидается в формате day/month/year.Если текущая культура ru-US , ввод ожидается в формате month/day/year.

Настройки культуры для текущей темы можно найти, посмотрев на тему .Свойство CultureInfo из Thread.CurrentThread .

Если вы не хотите анализировать строку даты / времени в соответствии с настройками культуры для текущего потока, вы должны указатьнастройки культуры в явном виде.

Ваш ввод, кажется, в формате en-US , в то время как ваша система настроена как fr-FR или en-GB .Поэтому явно укажите en-US в качестве культуры:

DateTime result = DateTime.Parse("07/21/2011", new CultureInfo("en-US"));
// result.Day   == 21
// result.Month == 7
// result.Year  == 2011

Причина, по которой ваш первый пример работает, заключается в том, что 1 является допустимым месяцем, в отличие от 21.

DateTime result = DateTime.Parse("08/01/2011", new CultureInfo("fr-FR"));
// result.Day   == 8
// result.Month == 1
// result.Year  == 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...