2015-08-07 2 views
3

Это очень странная дата, из которой я никогда не видел, прежде чем возвращаться из какого-то API в JSON.Как я могу проанализировать следующую строку в DateTime?

"Tue Aug 04 2015 00:17:38 GMT+0000 (UTC)"

Это порождает следующую ошибку:

System.FormatException: String was not recognized as a valid DateTime.

что понятно при использовании следующего метода для анализа:

DateTime.Parse(x.process_date.Value) 

Любой дело со сложными форматами дат, может знать, как разбирать это?

+0

Предполагая, что это всегда один и тот же формат, как насчет изменения строки в другом формате, прежде чем разбирать ее? – Alkasai

+0

Я имею в виду, конечно, это не невозможно, но это не супер чисто. Я уверен, что есть способ преобразования этого типа вещей в .NET. –

ответ

7

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

Что-то подобное может работать:

var dateString = "Tue Aug 04 2015 00:17:38 GMT+0000 (UTC)"; 
var format = "ddd MMM dd yyyy HH:mm:ss GMT+0000 (UTC)"; 

var parsed = DateTime.ParseExact(
    dateString, 
    format, 
    System.Globalization.CultureInfo.InvariantCulture); 

Или, используя TryParseExact:

DateTime parsed; 
if (DateTime.TryParseExact(
    dateString, 
    format, 
    System.Globalization.CultureInfo.InvariantCulture, 
    DateTimeStyles.None, 
    out parsed) 
{ 
    // parsing was successful 
} 
else 
{ 
    // parsing failed 
} 

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

  • ddd - сокращенное название дня недели.
  • MMM - Сокращенное наименование месяца.
  • dd - День месяца с 01 по 31.
  • yyyy - год как четырехзначное число.
  • HH:mm:ss - час, с использованием 24-часовых часов от 00 до 23; минута, с 00 до 59; а второй - от 0 до 59 (разделены : символами).
  • GMT+0000 (UTC) - только статический текст, который принимает форматная строка, всегда будет присутствовать. Это довольно хрупкое и может привести к сбою вашего синтаксического анализа, если API когда-либо возвращает другой текст здесь. Подумайте об усечении этого текста или используя NodaTime, который предлагает отличную поддержку часовых поясов.

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

Дополнительные сведения о построении строки формата см. В разделе Custom Date and Time Format Strings на MSDN.

В качестве альтернативы, вы можете отказаться от использования System.DateTime в пользу NodaTime. Я меньше знаком с NodaTime, но отличная документация доступна как here on StackOverflow, так и на сайте NodaTime.

+0

очень приятно, спасибо! –

+1

Также имейте в виду, что если последний бит меняется, вам может потребоваться изучить либо модификаторы 'K', либо zzz', либо просто вырезать часть текста, т. Е. Отрезать' (UTC) 'и разобрать 'GMT + 0000'. Будьте осторожны при разрезании, что вы не теряете информацию, но я предполагаю, что '(UTC)' избыточно и избыточно, если вы уважаете часть 'GMT + 0000'. – holroy

+0

@holroy Да, вы можете жестко запрограммировать его на поиск 'Tue',' Aug' или '2015', а также' GMT + 0000', но это похоже на плохую идею :) – Rawling

Смежные вопросы