2014-02-11 3 views
2

Используя нижеприведенный метод DateTime.TryPaseExact дает мне разные варианты, когда ожидается.DateTime.TryParseExact Ошибочные результаты

я получаю следующие форматы вернулся из кода ниже:

2014-02-10 18:32:37 
1402-10-18 17:23:00 (which is clearly incorrect) 

Как только получить формат yyyy-MM-dd HH:mm:ss вернулся?

static readonly string[] DateFormats = new string[] { "yyMMddHHmm", "yyyyMMddHHmm", "yyMMddHHmmss", "yyyy-MM-dd HH:mm:ss" }; 

DateTime date;          
DateTime.TryParseExact("140211090915", DateFormats, CultureInfo.InvariantCulture, 
           DateTimeStyles.AssumeLocal, out date); 

Кроме того, если кто-то может объяснить, почему это 140211084947 вход возвращает ожидаемый формат и 140211090915 возвращает нежелательный формат я был бы благодарен

ответ

5

Очевидно, что вы ошибаетесь.

Когда формат yyMMddHHmmss, он принимает первые 2 цифры в год, который в данном случае является 14 и автоматически преобразуется в 2014.

Когда формат примерно yyyy...., он принимает первые цифры 4 в виде года, который в вашем случае равен 1402.

От The "yy" Custom Format Specifier

В операции анализа, год двузначный, который разбирается с помощью «уу» пользовательского спецификатор формата интерпретируется на основе Calendar.TwoDigitYearMax имущества текущего календаря поставщика формата в.

От Calendar.TwoDigitYearMax property

Это свойство позволяет 2-значный год быть надлежащим образом переведены на 4-значного года. Например, если для этого свойства установлено значение 2029, 100-летний диапазон составляет от 1930 до 2029. Следовательно, двузначное значение 30 интерпретируется как 1930, тогда как двузначное значение 29 интерпретируется как 2029.

Как Marcin mentioned, ваша входная строка не совпадает с yyMMddHHmm и yyyy-MM-dd HH:mm:ss форматов.

Ваш 140211084947 строка совпадает с форматом yyMMddHHmmss, но он не совпадает с форматом yyyyMMddHHmm (Поскольку 49 не действует час)

+0

Ни 'yyMMddHHmm' ни' гггг-мм-дд чч: мм: ss' матчи строка ввода – MarcinJuraszek

+0

@MarcinJuraszek Да, вы правы. Но он соответствует формату 'yyMMddHHmmss' и' yyyyMMddHHmm'. Из метода '' DateTime.TryParseExact' '(http://msdn.microsoft.com/en-us/library/h9b85w22%28v=vs.110%29.aspx) _ Формат представления строки должен совпадать ** по крайней мере один из указанных форматов. ** –

+2

В вашем ответе не совсем понятно, почему он иногда выбирает один формат, а иногда другой, который, по-видимому, связан с тем, что в случае значения 140211090915 значение «0915» является действительным time, do соответствует первому шаблону, тогда как для 140211084947 «4947» - нет, поэтому применяется следующий шаблон. – Iridium

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