Строка не была распознана как допустимый DateTime "формат дд / мм / гггг" - PullRequest
152 голосов
/ 03 февраля 2010

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

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

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

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

Редактировать

В чем различия между Parse и ParseExact?

Редактировать 2

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

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

Ответы [ 14 ]

227 голосов
/ 03 февраля 2010

Использование DateTime.ParseExact.

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

DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", null);
41 голосов
/ 03 февраля 2010

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

Например:

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

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

20 голосов
/ 03 февраля 2010

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

15 голосов
/ 17 ноября 2012

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

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

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

10 голосов
/ 03 февраля 2010

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

    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

3 голосов
/ 25 июля 2017

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

// e.g. format = "dd/MM/yyyy", dateString = "10/07/2017" 
var formatInfo = new DateTimeFormatInfo()
{
     ShortDatePattern = format
};
date = Convert.ToDateTime(dateString, formatInfo);
3 голосов
/ 31 марта 2014

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

 string strDate = PreocessDate(data);
 string[] dateString = strDate.Split('/');
 DateTime enter_date = Convert.ToDateTime(dateString[1]+"/"+dateString[0]+"/"+dateString[2]);
2 голосов
/ 15 февраля 2013
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 голосов
/ 29 июня 2010

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

Datetime DT = DateTime.ParseExact(STRDATE,"dd/MM/yyyy",System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat)
1 голос
/ 22 января 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...