2012-01-24 3 views
2

Почему следующий код генерирует исключение FormatException?DateTime.ParseExact FormatException

DateTime.ParseExact("03/01/2012", "dd/MM/yyyy", null); 

DateTime.ParseExact

Возможно, что-то делать с тем, что код работает под IIS 7.5 Express, как часть логики выполнения MVC3 сайта?

+2

Я запустил его в LinqPad и не имел проблем. –

+0

Попробуйте указать Инвариантную культуру, если вы собираетесь предоставить определенный шаблон преобразования или предоставить шаблон, более соответствующий культуре текущего потока. –

+0

Я добавил доказательство моего случая =) –

ответ

4

Вам нужно включить CultureInfo, например:

DateTime.ParseExact("03/01/2012", "dd/MM/yyyy", new CultureInfo("en-US")); 

Slashes в строке формата являются культура чувствительна, и если вы не сдадите в CultureInfo, используется текущая культура. Вы также можете использовать CultureInfo.InvariantCulture, и он будет работать. Jon Skeet provides some detailed explanation here.

+0

Исходный вызов метода зависит от 'CultureInfo.CurrentCulture.DateTimeFormat.DateSeparator', который может быть' '/' ',' "-" ',' "." И т. Д. Если вы хотите использовать литеральную косую черту, и вы не хотите использовать «InvariantCulture», выйдите из косой черты, как в 'DateTime.ParseExact (« 03/01/2012 », @" dd \/MM \/yyyy ", null);'. –

3

зависит от вашей культуры, чтобы считать, что из уравнения ....

DateTime.ParseExact("03/01/2012", "dd/MM/yyyy", CultureInfo.InvariantCulture); 
2

Согласно documentation, FormatException брошено, учитывая один из этих условий:

public static DateTime ParseExact(
    string s, 
    string format, 
    IFormatProvider provider 
) 
  • s или формат - пустая строка.
  • s не содержит дату и время, соответствующие шаблону, указанному в формате.
  • Компонент часа и обозначение AM/PM в с не согласны.

Если вы передаете в нуль IFormatProvider, я думаю он по умолчанию культуре текущего потока. Мне нужно взглянуть на это в Reflector. Есть ли причина, по которой вы хотели бы пройти в null?

UPDATE:

Я смотрел на нее в .NET Reflector и он по умолчанию текущего потока DateTimeFormatInfo. Я не знаю, разрешено ли мне здесь размещать код.

Смежные вопросы