Строка не была распознана как допустимое исключение формата DateTime - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь сделать простой анализ, используя следующие операторы:

//In actual code the date time value comes from db
var dateTime = new DateTime(2018, 04, 26);

var dtExtact = DateTime.ParseExact(dateTime.ToString(), "dd MMM yyyy HH:mm:ss:fff",null);

Теперь, когда я пытаюсь сделать это, получаю ошибку,

System.FormatException: 'Строка не была распознана как допустимый DateTime.'

Я посмотрел образец MSDN , но он не дает никаких указаний на то, что не так с моим временем даты.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

И ToString (), и Parse () предназначены для автоматического извлечения настроек Region из Windows. Это редко хорошая идея переопределить это поведение. И, видимо, ваш шаблон не является действительным. Насколько мы знаем, ':' на самом деле не является надлежащим культурным разделителем для элементов времени

В целом это выглядит довольно подозрительно - вы превращаете DateTime в строку, только чтобы снова разобрать его прямо здесь. Я могу только догадываться, что это для тестирования. Но тестирование по какому вопросу.

У меня есть 3 общих правила при работе с DateTimes:

  • Всегда сохраняйте, извлекайте и передавайте значение UTC. Вы не хотите добавлять часовые пояса к своим проблемам. Так лежит безумие . Есть редкие исключения, но вы сами справляетесь с этим беспорядком
  • Избегайте хранения, восстановления или передачи в виде текста. как можно дольше храните его в надлежащих типах данных
  • Если вы можете следовать 2-му правилу (используя XML или другую сериализацию), по крайней мере выберите фиксированный формат культуры, формат строки и кодирование строки на всех конечных точках. Вы не хотите добавлять эти проблемы в свои заботы

Следуя этим правилам, у меня редко возникали какие-либо проблемы.

0 голосов
/ 27 апреля 2018

Если вы хотите проанализировать строку даты и времени в определенном формате, убедитесь, что отформатированная строка даты / времени соответствует формату вашего синтаксического анализатора.

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

var dateTime = new DateTime(2018, 04, 26);
const string dateFormat = "dd MMM yyyy HH:mm:ss:fff";
var dtExact = DateTime.ParseExact(
    dateTime.ToString(dateFormat)
,   dateFormat
,   null
);
Console.WriteLine("{0} {1}", dateTime, dtExact);

Демо-версия.

...