Как конвертировать даты без получения 'String не был распознан как допустимый DateTime.' - ошибка? - PullRequest
2 голосов
/ 01 июня 2011

Я пытаюсь преобразовать даты, например 30/12/2000 в 2000-12-30, используя этот код:

System.Globalization.CultureInfo enUS = new System.Globalization.CultureInfo("en-US");
DateTime.ParseExact(row.Cells[6].ToString(), "yyyy-MM-dd", enUS);

Но я получаю эту ошибку:

String was not recognized as a valid DateTime. 

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

Ответы [ 10 ]

2 голосов
/ 01 июня 2011

Причина, по которой вы получаете это, в точности соответствует исключению: строка имеет неправильный формат, скорее всего причина в том, что на машине, выполняющей сравнение, установлена ​​другая дата и время, установленная на yyyy-MM-dd.

Если вы извлекаете это из базы данных, а возвращаемое значение имеет дату-время (или если вы знаете, что row.Cells [6] является полем DateTime, должно работать следующее:

System.Globalization.CultureInfo enUS = new System.Globalization.CultureInfo("en-US");

if (row.Cells[6] != null)
    DateTime.ParseExact(((DateTime)row.Cells[6]).ToString("yyyy-MM-dd"), "yyyy-MM-dd", enUS);

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

if (row.Cells[6] != null)
    TextBox1.Text = ((DateTime)row.Cells[6]).ToString("yyyy-MM-dd");

РЕДАКТИРОВАТЬ Учитывая, чтоrow.Cells [6] является строкой, вам всегда нужно будет знать, какой формат строки, и если вы это сделаете, это будет так просто:

Со временем:

DateTime ParsedDate = DateTime.ParseExact(row.Cells[6].ToString(), "dd-MM-yyyy h:mm", enUS);

Удаление времени с последующим разбором:

DateTime ParsedDate = DateTime.ParseExact(row.Cells[6].ToString().Substring(0,10), "dd/MM/yyyy", enUS);

, а затем вывод его в нужном формате будет простым:

TextBox1.Text = ParsedDate.ToString("yyyy-MM-dd");
2 голосов
/ 01 июня 2011

Вы можете использовать функцию DateTime.TryParse() и проверить, является ли результат истинным или ложным.
Таким образом, вы можете попытаться проанализировать дату в указанном формате и, если это не правильно, попробовать другую и так далее ...

1 голос
/ 01 июня 2011

Вы указываете объект en-US CultureInfo, но 30/12/2000 не является правильным форматом даты США

0 голосов
/ 08 июня 2011

Я исправил это с помощью

Convert.ToDateTime(row.Cells[6].Text)

Посмотрите, как это просто.

0 голосов
/ 08 июня 2011

Если ваша исходная строка в формате дд / мм / гггг, то вам не следует использовать культуру США (ММ / дд / гггг) для разбора строки.

System.Globalization.CultureInfo enGB = new System.Globalization.CultureInfo("en-GB");
DateTime temp = DateTime.ParseExact(row.Cells[6].Text, "dd/MM/yyyy", enGB);

row.Cells[6] = temp.ToString("yyyy-MM-dd");

Поместите это в событие RowDataBound вашей сетки.

0 голосов
/ 01 июня 2011

вы забыли часы / минуты:

из БД, вот так (преобразовано в строку) "12/05/2011 0:00"

DateTime.ParseExact(theCellValue, "MM/dd/yyyy HH:mm", enUS).ToString("yyyy-MM-dd")

создает строкуВы хотите, но это совершенно глупо.Вы просто должны убедиться, что дата и время в первую очередь отформатированы так, как вы хотите.(тогда вам никогда не придется разбирать его)

0 голосов
/ 01 июня 2011

использование

  System.Globalization.CultureInfo.InvariantCulture

 DateTime.ParseExact(((DateTime)row.Cells[6]).ToString("yyyy-MM-dd"), "yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture)

;

0 голосов
/ 01 июня 2011

Я считаю, что проблема - ваш второй параметр.Если вы передадите 30/12/200 в качестве входных данных, произойдет сбой, поскольку второй параметр ожидает, что он разделен тире.

0 голосов
/ 01 июня 2011
System.Globalization.CultureInfo enUS = new System.Globalization.CultureInfo("en-US");
try {
 DateTime.ParseExact(row.Cells[6].ToString(), "yyyy-MM-dd", enUS);
}
catch (FormatException) {
 ...your code instead of error...
}
0 голосов
/ 01 июня 2011

Попробуйте, это может решить вашу проблему

String oldScheduledDate = "16-05-2011";
 DateFormat oldFormatter = new SimpleDateFormat("dd/MM/yyyy");
 DateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
 try
 {
    Date oldDate = (Date)oldFormatter .parse(oldScheduledDate);
 }
 Catch(Exception ex ) { /// process exception}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...