it-roy-ru.com

Строка не была распознана как допустимый DateTime "формат дд/мм/гггг"

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

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

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

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

Правка  

Каковы различия между Parse и ParseExact?

Правка 2

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

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

142
Shantanu Gupta

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

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

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

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

Например:

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

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

39
SLaks

Разбор строкового представления 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
Greg

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

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

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

15
Amit Philips

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

    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

8
Ricardo Sanchez
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
Bala Kumar

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

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

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

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

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

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

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

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

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

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

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

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

using System.Globalization;
0
Anjan Kant

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

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
Serkan Hekimoglu