2013-02-13 1 views
2

я получаю следующее исключение при преобразовании в DateTime:Строка не была признана в качестве действительного DateTime, когда синтаксического анализа точной

String was not recognized as a valid DateTime. 

lbl_RequestDate.Text = "13/2/2013"; 

CultureInfo provider = CultureInfo.CurrentCulture; 
string[] format = provider.DateTimeFormat.GetAllDateTimePatterns(); 
Follow.RequestDate = DateTime.ParseExact(lbl_RequestDate.Text, format, provider, DateTimeStyles.None); 
+0

Что такое тип Follow.RequestDate? И какая у вас культура? Является ли MM/DD/YYYY действительным? – Jocke

+0

Что _is_ 'CurrentCulture' (' поставщик')? В некоторых культурах строка разделителя дат отличается от ''/''. –

ответ

4

Вы можете использовать формат tje d/M/yyyy, Обратите внимание, что только один M используется в течение месяца.

Follow.RequestDate = DateTime.ParseExact(lbl_RequestDate.Text, "d/M/yyyy", provider, DateTimeStyles.None); 

Метод: provider.DateTimeFormat.GetAllDateTimePatterns() возвращает почти 155 форматов, но ни один из них (от текущей культуры, кажется,) поддерживает формат d/M/yyyy, поэтому вы получаете исключение. Если ваша дата имеет месяц 13/02/2013, тогда форматы, возвращаемые методом, будут работать, так как самый близкий формат - dd/MM/yyyy в массиве форматов.

+0

Вы: _none из них поддерживает формат 'd/M/yyyy'_ Ну, это сильно зависит от провайдера. Например, 'en-SG' (английский (Сингапур)),' pt-BR' (португальский (Бразилия)), 'el-GR' (греческий (Греция)) и многие другие, поддерживают' 'd/M/гггг "'. –

+0

@JeppeStigNielsen, о, отлично, не знал этого, спасибо – Habib

2

Может быть, это поможет:

DateTime.ParseExact("13/2/2013","d/M/yyyy",CultureInfo.GetCultureInfo("en-US"), DateTimeStyles.None); 

уведомление :

d is for Day (01 is also acceptable) 
M is for Month (11 is also acceptable) 
+0

Буду рад узнать, почему этот downvote. хотя это правильно. –

+0

Может быть, потому, что вы написали «13/2/2013» прямо в метод? Я не знаю, это правда. +1 – jAC

+0

Зачем вам использовать культуру 'en-US'? Просто потому, что это соответствует формату даты, представленному в вопросе? Для меня другие ответы выше. –

1

Попробуйте так:

Follow.RequestDate = DateTime.ParseExact(lbl_RequestDate.Text, "d/M/yyyy", CultureInfo.InvariantCulture); 
+1

В большинстве случаев, когда вам нужен одиночный 'M', вам также нужен один' d', так: '' d/M/yyyy ''. –

+0

@JeppeStigNielsen Хорошо заметили, спасибо. –

1

DateTimeFormatInfo.GetAllDateTimePatterns() метод возвращает на моей машине (tr-TR культуры) 29 формата, но ни один из них поддержки d/M/yyyy формата даты, что нет, почему вы получаете FormatException.

Но в моей культуре DateSeparator является . поэтому я не могу точно решить эту проблему с помощью CultureInfo.CurrentCulture, но когда я использую Египет CultureInfo (он писал в своем профиле) CultureInfo.GetCultureInfo("ar-EG") этот код работает без каких-либо ошибок;

CultureInfo provider = CultureInfo.GetCultureInfo("ar-EG"); 
string[] format = provider.DateTimeFormat.GetAllDateTimePatterns(); 
DateTime d = DateTime.ParseExact("13/02/2013", format, provider, DateTimeStyles.None); 

Unfortunatly ваш все ваш шаблон даты и время не поддерживает формат d/M/yyyy.

enter image description here

Unfortunatly, изменяя эту строку 13/02/2013 не решает эту проблему, потому что, как я сказал в ранее, мои все форматы (в tr-TR культуры) не поддерживает формат dd/MM/yyyy либо.

Мой скромный совет здесь, перечислите все ваши шаблоны datetime и проверьте вручную, если ваша строка распознана в формате с этим шаблоном datetime;

string[] format = provider.DateTimeFormat.GetAllDateTimePatterns(); 
foreach (var f in format) 
{ 
    /// 
} 

enter image description here

+1

Когда провайдер является культурой 'tr-TR', строка' DateSeparator' ''. "'. Таким образом, любая неэкранированная косая черта в строке формата, например, косые черты в '' d/M/yyyy'', преобразуется в период. Итак, это должно проанализировать: 'DateTime.ParseExact (« 13.2.2013 »,« d/M/yyyy », новый CultureInfo (« tr-TR »));' –

+0

@JeppeStigNielsen Вы правы. Я пропустил это. Будет обновлен ответ. –