Строка не была признана действительным 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, производительность или что-то, что вам кажется

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

 this.Text="22/11/2009"; DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", null); 

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

Например:

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

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

Анализ синтаксического представления 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 , и если / почему оно отличается от ожидаемого.

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

      

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

Возможно, вам нужно указать культуру для данного формата даты, как в:

  Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB"); //dd/MM/yyyy this.Text="22/11/2009"; DateTime date = DateTime.Parse(this.Text); 

Более подробную информацию см. Здесь:

http://msdn.microsoft.com/en-us/library/5hh873ya.aspx

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

 Datetime DT = DateTime.ParseExact(STRDATE,"dd/MM/yyyy",System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat) 
 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; } 

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

  string strDate = PreocessDate(data); string[] dateString = strDate.Split('/'); DateTime enter_date = Convert.ToDateTime(dateString[1]+"/"+dateString[0]+"/"+dateString[2]); 

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

 // eg format = "dd/MM/yyyy", dateString = "10/07/2017" var formatInfo = new DateTimeFormatInfo() { ShortDatePattern = format }; date = Convert.ToDateTime(dateString, formatInfo); 

Точно так же, как кто-то из вышеперечисленных, вы можете отправить его как строковый параметр, но он должен иметь этот формат: «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 может преобразовать его и поместить в вашу базу данных.

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

 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 

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

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

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

 using System.Globalization; 

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

 public string FormatDate(string date, string format) { try { return DateTime.Parse(date).ToString(format); } catch (FormatException) { return string.Empty; } } 

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

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

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

Interesting Posts
Давайте будем гением компьютера.