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

Ответ 1

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

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

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

Ответ 2

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

Например:

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

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

Ответ 3

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

Ответ 5

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

    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

Ответ 6

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

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

Ответ 7

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

Datetime DT = DateTime.ParseExact(STRDATE,"dd/MM/yyyy",System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat)

Ответ 8

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;
}

Ответ 9

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

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

Ответ 10

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

Ответ 11

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

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

Ответ 12

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

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

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

using System.Globalization;

Ответ 13

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

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

Ответ 14

Это также может быть проблемой, если ваша строка 15.06.2009. DateTime Parse ожидает, что это будет 15.06.2009.

Итак, сначала разделить его по косой

var dateParts = "6/15/2019"
var month = dateParts[0].PadLeft(2, '0');
var day = dateParts[1].PadLeft(2, '0');
var year = dateParts[2] 


var properFormat = month + "/" +day +"/" + year;

Теперь вы можете использовать DateTime.Parse(ProperFormat, "MM/dd/yyyy"). Это очень странно, но это единственное, что работает для меня.

Ответ 15

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

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

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