2014-11-06 2 views
1

У меня есть строка (642014), которая находится в формате Mdyyyy.
Я хочу преобразовать строку в 04062014 (ddMMYYYY).
Я пробовал следующий код.
Пожалуйста, помогите.DateTime преобразование из строки C#

DateTime.TryParseExact("642014", "MMddyyyy", 
         CultureInfo.InvariantCulture, 
         DateTimeStyles.None, out "04062014"); 
+3

какой будет дата 1112014? – serdar

+0

Попробуйте использовать 'DateTime.TryParseExact (« 642014 »,« Mdyyyy », CultureInfo.InvariantCulture);' И помните import 'using System.Globalization;' – MrMins

+0

Возможно, вы путаете 'Mdyyy' и' MMddyyy'? – Codor

ответ

5

Это недопустимый формат даты.

Чтобы выделить вопрос 11120141st of Nov или 11th of Jan?

Если у вас есть какое-то соглашение, позволяющее определить, на какую дату оно ссылается, в этих случаях вы можете выполнить какую-либо предварительную обработку или разобрать строку вручную, но вы не найдете ничего, что было бы встроено в 'для этого формата

-1

Чтобы разобрать вашу строку, добавьте косую черту в соответствующих позициях, то разобрать его

string str = "642014"; 
str = str.Insert(2,"/").Insert(1,"/"); 
var result = DateTime.ParseExact(str, "M/d/yyyy",CultureInfo.InvariantCulture); 
+0

Но это не решает проблему неопределенности 1112014. –

+0

@Stewart_R Уверен, что это так. Но это то, что ОП просит –

3

Ваша ситуация выглядит еще самой широкой форме вопроса.

От 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"

Спасибо, Тарек

Особая благодарность; Тарек Махмуд Сайед, Уэс Хаггард и Ричард Ландер.

+0

@ Downvoter позаботиться прокомментировать, по крайней мере, чтобы я мог видеть, где я могу ошибаться? –

+0

Я не являюсь нисходящим здесь, но ... Я думаю, что пример «1112014» в комментариях и в моем ответе показывает суть проблемного формата OP. Ваш собственный ответ (несмотря на несомненную ценность, которую он приносит из ваших знаний о методе и реализации метода .TryParseExact()), на самом деле не затрагивает эту проблему. В этом примере 'date.Length == 7', поэтому он пропускает всю вашу предварительную обработку и все еще прибывает в' .TryParseExact() 'с той же двусмысленностью относительно того, представляет ли он 1 ноября или 11 января –

+0

@Stewart_R Извините, но вы ошибаетесь , '1112014' не показывает проблему OP. Вы говорите, что это будет «1 ноября» или «11 января»? Вы правы в строке '1112014', но это не влияет на строку' 642014'. Зачем? Потому что, поскольку ОП анализирует этот формат ММДdyyyy. Мы должны сказать, что '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''. Все выглядит правильно. Но это не так. Здесь мы сталкиваемся с правилом '' самой широкой формы '', когда строка не имеет разделителя дат, как я упоминал в своем ответе. –

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