Ошибка при синтаксическом анализе даты и времени

#c# #datetime

#c# #дата и время

Вопрос:

Я получаю следующее сообщение об ошибке в моей программе на C # в инструкции:

 dr["StartDate"] = Convert.ToDateTime(dr["business_dt"]).ToString("MM/dd/yyyy");
  

Я не получаю эту ошибку на своей машине в США.Но он выдает ошибку на компьютере пользователя, расположенном за пределами США.
Формат даты, возвращаемый из datareader: 31.08.2010 12:00:00

Система.FormatException: строка не была распознана как допустимая дата и время. в системе.DateTimeParse.Выполните синтаксический анализ (String s, DateTimeFormatInfo dtfi, стили DateTimeStyles) в системе.Преобразовать.ToDateTime(строковое значение, поставщик IFormatProvider) в системе.Строка.Система.Значок конвертируемый.Текущее время (поставщик IFormatProvider) в системе.Преобразовать.Текущее время (значение объекта)

Пожалуйста, сообщите.

Спасибо.

Комментарии:

1. Почему ваш DataRow в любом случае содержит строки вместо значений DateTime?

Ответ №1:

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

использовать DateTime.ParseExact метод:

 var dateString = dr["business_dt"].ToString();
var format = "MM/dd/yyyy hh:mm:ss tt";
var dateTime = DateTime.ParseExact(dateString, format, CultureInfo.InvariantCulture);
dr["StartDate"] = dateTime;
  

Комментарии:

1. Я попробовал, и это не сработало: ИМХО, вы должны использовать var format = "MM/dd/yyyy hh:mm:ss tt"

2. @Davide,@Marco, у меня это не сработало. По-прежнему выдается ошибка: «входная строка была не в правильном формате». Я тоже попробовал это, и оно выдает ту же ошибку: DateTime. ParseExact(DateTime.Now.toString(), «ММ / дд / гггг чч: мм: ss tt», CultureInfo. Инвариантная культура); Спасибо.

3. да, используйте пример в моем ответе, а не этот ваш код из комментария выше, он отличается…

4. Нет, Давиде, ты отредактировал не ту часть, я думаю: ты должен сделать var dateString = dr["business_dt"].ToString(); var format = "MM/dd/yyyy hh:mm:ss tt"; , а затем оставшуюся часть кода!!

5. Предполагается, что dr[«business_dt»] имеет тип DateTime . Я думаю, что это строка типа.

Ответ №2:

Проблема в том, что в нескольких странах месяц и дневная часть даты перевернуты. В США это «ММ / дд / гггг», например, в Германии это «дд / мм / гггг».

Итак, вам нужно указать, в каком формате находится ваша строка (в вашем случае это похоже на формат США, поэтому я выбрал эту культуру):

 DateTime date = Convert.ToDateTime(dr["business_dt"], new CultureInfo("en-US"));
dr["StartDate"] = date.ToString("MM/dd/yyyy");
  

Комментарии:

1. Пожалуйста, оставьте комментарий при голосовании против.

Ответ №3:

Это происходит потому, что язык компьютера по умолчанию говорит, что формат даты «дд / ММ / гггг», а в вашем случае месяц указывается как «31», что неверно, поэтому он выдает ошибку.

Пожалуйста, установите культуру перед анализом даты и времени.

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

 CultureInfo CultureInfo1 = (CultureInfo)CultureInfo.CurrentCulture.Clone();
CultureInfo1.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";
Thread.CurrentThread.CurrentCulture = CultureInfo1;
  

дайте мне знать, если это поможет.

Ответ №4:

У меня только что возникла связанная с этим проблема в ASP.NET . Проблема возникла на ОДНОМ веб-сайте на веб-сервере, на котором запущены ДВЕ (почти идентичные) копии кода. Какое-то время я собирался, так как никакая логика, казалось, не соответствовала симптомам. Оказалось, что это проблема с Web.Config. Сбойный сайт отсутствовал:

 <globalization uiCulture="en" culture="en-AU" /> from the <system.web> section.
  

Подумал, что я просто упомяну об этом на случай, если это кому-нибудь поможет.