Строка не была признана действительным DateTime "format dd/MM/yyyy"

Я пытаюсь преобразовать значение строки в формате date в формат даты dd/MM/yyyy.

this.Text="22/11/2009";

DateTime date = DateTime.Parse(this.Text);

В чем проблема? Он имеет второе переопределение, которое запрашивает IFormatProvider. Что это? Нужно ли мне это передавать? Если да, как использовать его для этого случая?

Изменить

В чем разница между Parse и ParseExact?

Изменить 2

Оба ответа Slaks и Sam работают для меня, в настоящее время пользователь вводит ввод, но я уверен, что они действительны с помощью maskTextbox.

Какой ответ лучше рассматривать во всех аспектах, таких как тип saftey, производительность или что-то, что вам нравится

4b9b3361

Используйте DateTime.ParseExact.

this.Text="22/11/2009";

DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", null);
203
ответ дан 03 февр. '10 в 18:27
источник

Вам нужно вызвать ParseExact, который анализирует дату, которая точно соответствует предоставленному вами формату.

Например:

DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture);

Параметр IFormatProvider указывает культуру, используемую для анализа даты.
Если ваша строка не принадлежит пользователю, вы должны передать CultureInfo.InvariantCulture.
Если строка поступает от пользователя, вы должны передать CultureInfo.CurrentCulture, который будет использовать параметры, указанные пользователем в региональных параметрах на панели управления.

38
ответ дан 03 февр. '10 в 18:28
источник

Анализ строкового представления DateTime является сложной задачей, потому что разные культуры имеют разные форматы дат..Net знает эти форматы даты и извлекает их из вашей текущей культуры (System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat), когда вы вызываете DateTime.Parse(this.Text);

Например, строка "22/11/2009" не соответствует ShortDatePattern для США (en-US) но он подходит для Франции (fr-FR).

Теперь вы можете вызвать DateTime.ParseExact и передать строку точного формата, которую вы ожидаете, или передать соответствующую культуру в DateTime.Parse для анализа даты.

Например, это правильно проверит вашу дату:

DateTime.Parse( "22/11/2009", CultureInfo.CreateSpecificCulture("fr-FR") );

Конечно, вы не должны просто произвольно выбирать Францию, а что-то подходящее для ваших нужд.

Что вам нужно выяснить, для чего установлен System.Threading.Thread.CurrentThread.CurrentCulture, и если/почему он отличается от ожидаемого.

18
ответ дан 03 февр. '10 в 18:56
источник

Хотя приведенные выше решения эффективны, вы также можете изменить файл webconfig следующим образом:

<configuration>
   <system.web>
     <globalization culture="en-GB"/>
   </system.web>
</configuration>

Ссылка: Формат даты и времени на локальном компьютере по сравнению с производственной машиной

14
ответ дан 17 нояб. '12 в 16:39
источник
private DateTime ConvertToDateTime(string strDateTime)
{
DateTime dtFinaldate; string sDateTime;
try { dtFinaldate = Convert.ToDateTime(strDateTime); }
catch (Exception e)
{
string[] sDate = strDateTime.Split('/');
sDateTime = sDate[1] + '/' + sDate[0] + '/' + sDate[2];
dtFinaldate = Convert.ToDateTime(sDateTime);
}
return dtFinaldate;
}
2
ответ дан 15 февр. '13 в 9:40
источник

На основе эта ссылка, следующий подход работал у меня:

// e.g. format = "dd/MM/yyyy", dateString = "10/07/2017" 
var formatInfo = new DateTimeFormatInfo()
{
     ShortDatePattern = format
};
date = Convert.ToDateTime(dateString, formatInfo);
2
ответ дан 25 июля '17 в 17:46
источник

используйте это для преобразования строки в datetime:

Datetime DT = DateTime.ParseExact(STRDATE,"dd/MM/yyyy",System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat)
2
ответ дан 29 июня '10 в 16:24
источник

Проведя много времени, я решил проблему

 string strDate = PreocessDate(data);
 string[] dateString = strDate.Split('/');
 DateTime enter_date = Convert.ToDateTime(dateString[1]+"/"+dateString[0]+"/"+dateString[2]);
2
ответ дан 31 марта '14 в 8:43
источник

Как и кто-то выше, вы можете отправить его как строковый параметр, но он должен иметь такой формат: "20130121", и вы можете преобразовать его в этот формат, взяв его непосредственно из элемента управления. Поэтому вы получите его, например, из текстового поля, например:

date = datetextbox.text; // date is going to be something like: "2013-01-21 12:00:00am"

чтобы преобразовать его в: '20130121', который вы используете:

date = date.Substring(6, 4) + date.Substring(3, 2) + date.Substring(0, 2);

чтобы SQL мог преобразовать его и поместить в вашу базу данных.

1
ответ дан 22 янв. '13 в 2:56
источник

Работала для меня ниже кода:

DateTime date = DateTime.Parse(this.Text, CultureInfo.CreateSpecificCulture("fr-FR"));

Пространство имен

using System.Globalization;
0
ответ дан 19 сент. '16 в 13:49
источник

Простой способ без внешних ссылок:

public string FormatDate(string date, string format)
{
   try {
      return DateTime.Parse(date).ToString(format);
   }
   catch (FormatException) 
   {
      return string.Empty;
   }
}
0
ответ дан 25 апр. '18 в 1:19
источник

Вы также можете использовать

this.Text = "22112009";
DateTime newDateTime = new DateTime(Convert.ToInt32(this.Text.Substring(4, 4)), // Year
                                    Convert.ToInt32(this.Text.Substring(2,2)), // Month
                                    Convert.ToInt32(this.Text.Substring(0,2)));// Day
0
ответ дан 29 июня '10 в 16:28
источник

Изменить вручную:

string s = date.Substring(3, 2) +"/" + date.Substring(0, 2) + "/" + date.Substring(6, 4);

От 22.11.2015 он будет конвертирован в 22/11/2015

-3
ответ дан 23 июля '15 в 23:10
источник