Я не могу преобразовать мой объект "Time", который имеет свойства in0 и out0 из строки в DateTime.

for (int row = 2; row <= rw; row++)
                    {
                        for (cCnt = 6; cCnt <= 6; cCnt++)
                        {
                            var in0 = (String)(xlworkSheet.Cells[row, 7] 
                             as Excel.Range).Value;
                            Time.In0 = in0;
                            Console.WriteLine(Time.In0.ToString());
                            DateTime dtnew = DateTime.Parse(in0);

                            Excel.Range formatRange;
                            formatRange = xlNewSheet.Cells[row, 7];
                            formatRange.NumberFormat = "hh:mm";
                            xlNewSheet.Cells[row, 7].Value = Time.In0;

                        }
                    }
 //this is my class
  public class DateandTime 
      {
       public string In0 { get; set; }
       public string Out0 { get; set; }
       public string In1 { get; set; }
       public string Out1 { get; set; }
       public string In2 { get; set; }
       public string Out2 { get; set; }
       public string In3 { get; set; }
       public string Out3 { get; set; }
       public string In4 { get; set; }
       public string Out4 { get; set; }
       public string break_time { get; set; }

         }

Произошло необработанное исключение типа «System.FormatException» в mscorlib.dll

Дополнительная информация: Строка не была распознана как действительный DateTime.

c#
2
Gerald 30 Май 2019 в 10:49

2 ответа

Лучший ответ

Причина, по которой вы получаете эту ошибку, состоит в том, что когда вы используете DateTime.Parse(string), текущая культура потока используется для интерпретации этой даты / времени. Хотя .NET предположит, что это на сегодня, если вы не предоставите дату, формат времени ему неизвестен: он не знает, как интерпретировать четырехзначное число. Мы должны предоставить информацию о том, как интерпретировать эту строку.

Один из способов решить эту проблему - использовать DateTime '{{X1} }, а затем отформатируйте результат:

private static bool TryFormatTime(string time, out string formattedTime)
{
    formattedTime = null;
    DateTime parsedDate;
    if (!DateTime.TryParseExact(time, "HHmm", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out parsedDate))
    {
        return false;
    }

    formattedTime = parsedDate.ToString("HH:mm", System.Globalization.CultureInfo.InvariantCulture);
    return true;
}

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

private static bool TryFormatTime(string time, out string formattedTime)
{
    formattedTime = null;
    if (time.Length != 4 || !time.All(c => char.IsDigit(c)))
    {
        return false;
    }

    formattedTime = string.Format("{0}:{1}", time.Substring(0, 2), time.Substring(2, 2));
    return true;
}

Оба из них могут быть использованы следующим образом:

if (TryFormatTime("0655", out time))
{
    Console.WriteLine(time);
}
else
{
    Console.WriteLine("bad time");
}

Попробуйте их онлайн

1
John 30 Май 2019 в 08:30

'String was not recognized as a valid DateTime' говорит, что значение, которое вы предоставляете методу Parse, недопустимо для продолжения преобразования. Это означает, что вы должны посмотреть на возможность неправильного приведения в следующей строке:

var in0 = (String)(xlworkSheet.Cells[row, 7] as Excel.Range).Value;

Это также может быть правдой, поскольку не существует явного преобразования между полем Value в String, которое затем можно преобразовать в допустимый формат даты. Для меня это звучит так, как будто Excel.Range значение возвращает коллекцию некоторого типа, например, массив, и не существует неявного преобразования этого массива в строку, которая может быть преобразована в допустимый формат даты.

Обновление: вы можете проверить следующие URL-адреса для лучшего понимания диапазона и значений.

Worksheet.Range

Значение

0
Nair 30 Май 2019 в 08:28