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

172

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

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

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

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

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

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

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

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

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

Шантану Гупта
источник
7
@ Редактировать: это то, что документация для. msdn.microsoft.com/en-us/library/w2sa9yss.aspx
SLaks
2
ParseExact - это когда вы знаете точный формат строки даты, Parse - это когда вам нужно что-то, что может обрабатывать что-то более динамичное.
пряник

Ответы:

255

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

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

DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", null);
Сэмюэл Нефф
источник
8
Почему мы должны пройти ноль здесь?
Шантану Гупта
3
Ввод может быть "22/11/2009 12:00:00 AM" или "22/11/2009". Также культура машины разработки может отличаться от культуры производства. Так будет ли вышеприведенный код работать без проблем?
Рахатур
8
@Rahat, точный синтаксический анализ не будет работать, если формат не совпадает. Приведенный выше шаблон формата dd/MM/yyyyтак, что текстовая строка со временем не будет проанализирована должным образом. Вам нужно будет либо убрать время, либо включить его в шаблон формата. Существует перегрузка, ParseExactкоторая принимает массив шаблонов формата и будет анализировать текст, если он соответствует любому из них.
Сэмюэль Нефф
7
@SamuelNeff Почему бы вам не использовать CultureInfo.InvariantCultureвместо текущего, если вы все равно определяете формат?
Элвин Вонг
3
@Toolkit Причина в том, что косые черты в строке формата не являются буквальными косыми чертами. Они заменяются строкой разделителя даты в текущей культуре. Так что это зависит от культуры, как написано выше. Сэмюэл Нефф, попробуй Thread.CurrentThread.CurrentCulture = new CultureInfo("da-DK");, это сломает твое решение. Чтобы это исправить, используйте "dd'/'MM'/'yyyy"(защищать косые черты одинарными кавычками) или @"dd\/MM\/yyyy"(«экранировать» косые черты с помощью обратных косых черт).
Джеппе Стиг Нильсен
44

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

Например:

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

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

SLaks
источник
2
@Slaks: CultureInfo.InvariantCulture недоступен в коде. Нужно ли мне использовать какое-то пространство имен
Шантану Гупта,
3
using System.Globalization;
Утром
2
Вы также можете щелкнуть правой кнопкой мыши на ошибке и щелкнуть «решить», это заменит недостающее пространство имен.
Инки
Вы также можете дважды щелкнуть по ошибке и увидеть стрелку вниз, показывающую связанные пространства имен, которые вы можете использовать
Usman Younas
Также учитываются пробелы, например, если ваш строковый формат - «MM / dd / гггг ЧЧ: мм: сс» (примечание - 2 пробела) - тогда ваш формат для ParseExact также должен включать пробелы
Chris Halcrow
20

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

Greg
источник
Ваше решение не работает для меня, оно выдает ошибку типа «Строка не была распознана как действительный DateTime». и я передаю следующую дату ввода: «13/06/17» к вашему решению, но это дает ошибку. Пожалуйста, помогите мне.
Ганшям Лахани
16

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

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

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

Амит Филипс
источник
1
Амит Филипс, ты спас мой день .. Я перепробовал все возможные вещи. И это небольшое изменение работает. Спасибо.
RNH
1
Амит, ты действительно сын Божий.
Разъяренный медведь
10

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

    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

Рикардо Санчес
источник
4

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

 string strDate = PreocessDate(data);
 string[] dateString = strDate.Split('/');
 DateTime enter_date = Convert.ToDateTime(dateString[1]+"/"+dateString[0]+"/"+dateString[2]);
Атик Саркер
источник
3

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

Datetime DT = DateTime.ParseExact(STRDATE,"dd/MM/yyyy",System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat)
AshifJM
источник
3

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

// e.g. format = "dd/MM/yyyy", dateString = "10/07/2017" 
var formatInfo = new DateTimeFormatInfo()
{
     ShortDatePattern = format
};
date = Convert.ToDateTime(dateString, formatInfo);
Хесус Кастро
источник
2
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;
}
Бала Кумар
источник
1

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

Джени Рамирес
источник
0

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

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

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

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

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

using System.Globalization;
Анжан Кант
источник
-6

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

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

С 22.11.2015 будет конвертировано в 22.11.2015

sarta
источник