Ваша ситуация выглядит еще самой широкой форме вопроса.
От DateTime.TryParseExact
method
Если вы не используете даты или время разделителей в шаблоне пользовательского формата, использовать инвариантную культуру для параметра поставщика и широкой формы каждого пользовательского формата. Например, если вы хотите, чтобы указать часы в шаблоне, укажите более широкую форму «HH», а не более узкую форму «H».
Из-за этого разбор строк без какого-либо разделителя даты или времени может быть проблемой иногда.
Например, давайте поговорим о "d"
custom format specifier. Для части форматирования он форматирует вашу дневную часть с помощью одной цифры без переднего нуля. Но для разбора, это может разобрать и 4
и 04
. Это то же самое, что и "M"
custom format specifier. Я не говорю, что вы должны использовать спецификатор d
для 04
. Вы можете, но вы не должны. Вы всегда должны использовать лучшие форматы, которые точно соответствуют вашей строке.
Вот мое мнение о том, что здесь происходит;
Благодаря широкой формы правила, так как ваша строка не имеет разделитель даты, то формат следует ожидать самые широкие формы d
и M
, которые они dd
и MM
. Но я думаю, что эти спецификаторы ожидают с ведущими нулевыми значениями (например: 06
и 04
), когда они используются для одиночных цифр, потому что что они для. Я не мог найти никаких доказательств в поддержку моей теории, но я все еще расследую ее.
У меня есть решение, если ваши строки имеют всегдаMdyyyy
формат. Возможно, это не лучшее решение, но я думаю, что это полезно, если ваши строки имеют постоянный формат;
public static DateTime? ParseDate_Mdyyyy(string date)
{
if (date == null)
return null;
if (date.Length < 6)
return null;
if (date.Length == 6)
date = date.Insert(0, "0").Insert(2, "0");
DateTime dt;
if (DateTime.TryParseExact(date, "MMddyyyy",
CultureInfo.InvariantCulture,
DateTimeStyles.None, out dt))
return dt;
return null;
}
Теперь вы можете использовать этот метод как;
string s = "642014";
DateTime? date = ParseDate_Mdyyyy(s);
Console.WriteLine(date.Value.ToString("ddMMyyyy")); // 04062014
Я подключился к команде .NET Framework об этой проблеме, здесь их ответ;
Привет Soner,
Код синтаксического анализа на самом деле не ищет любой разделитель. Вот что происходит:
Для случая использования “MMddyyyy”
, синтаксический начинается в методе DoStrictParse
, который будет вызывать ParseByFormat
. Этот метод получит первую часть формата, который “MM”
, а затем вызывает ParseDigits
к получить эквивалентные цифры из строки разбираемого “642014”
который будет дать “64”
. Обратите внимание, что до этого времени не происходит проверки, если номер за пределами допустимого диапазона за месяц в выбранном календаре (который здесь является григорианским). Код разборе будет повторяться тот же процесс для “dd”
и получите эквивалентную часть “20”
, а затем будет повторять его “yyyy”
, но это не потому, что ожидают 4
цифры и мы имели только два (“14”
).
Для случая использования “Mdyyyy”
, он терпит неудачу, потому что почти те же самая причина при разборе части “M”
мы знаем, что месяц может быть 2
цифры так мы его карты “64”
и будем делать то же самое с “d”
, отображающим его до “20”
, а затем год не удастся. Я считаю, что это причина того, что документация всегда использует самую широкую форму.
Рекомендация здесь либо использовать 2
значные формы в строку как "06042014"
и синтаксический анализ должен преуспеть “MMddyyyy”
и “Mdyyyy”
тоже. Другой вариант, чтобы вставить сепаратор "6/4/2014"
или "06/04/2014"
и разобрать, как "M/d/yyyy"
Спасибо, Тарек
Особая благодарность; Тарек Махмуд Сайед, Уэс Хаггард и Ричард Ландер.
какой будет дата 1112014? – serdar
Попробуйте использовать 'DateTime.TryParseExact (« 642014 »,« Mdyyyy », CultureInfo.InvariantCulture);' И помните import 'using System.Globalization;' – MrMins
Возможно, вы путаете 'Mdyyy' и' MMddyyy'? – Codor