Парсинг Datetime - PullRequest
       9

Парсинг Datetime

2 голосов
/ 09 сентября 2010

У меня есть дата и время в виде строки, например. "2010-08-02", я пытаюсь преобразовать его в UTC с помощью следующего фрагмента кода

DateTime.ParseExact("2010-08-02Z", "yyyy-MM-ddZ", CultureInfo.InvariantCulture)

Когда я печатаю на консоль, я получаю следующее: 01.08.2010 17:00:00. Есть ли причина, по которой дата отображается как дата перед датой, которую я пытаюсь проанализировать? Я мог бы просто добавить к этому день, чтобы перейти к исходному дню, но я хотел посмотреть, есть ли что-то, что я делаю неправильно в форматировании, которое вызывает это.

Ответы [ 3 ]

3 голосов
/ 09 сентября 2010

РЕДАКТИРОВАТЬ: у меня была смесь того, чтобы быть правильным, а не :)

Показывает местное время, представленное строкой UTC . Досадно, что DateTime не проясняет подобные вещи, IMO. Кроме того, я не думаю, что вы хотите использовать «Z» в качестве спецификатора формата для часового пояса; это не совсем корректный спецификатор формата; это должно быть 'z', но это предназначено для таких вещей, как "+01: 00". Я думаю, что вы должны использовать «К». Честно говоря, это не совсем понятно, но если вы используете 'K', то он совершает круговые обходы, конечно (конечно же, также и «Z», но только потому, что он игнорирует его, рассматривая его как простой текст).

Вы можете исправить это, просто вызвав ToUniversalTime или (предпочтительно IMO), указав DateTimeStyles.AdjustToUniversal в качестве дополнительного аргумента:

DateTime dt = DateTime.ParseExact("2010-08-02Z", "yyyy-MM-ddK",
                                  CultureInfo.InvariantCulture,
                                  DateTimeStyles.AdjustToUniversal);
1 голос
/ 09 сентября 2010

UTC полуночи 2010-08-02, случается, в 5 вечера 2010-08-01.

0 голосов
/ 09 сентября 2010

Если исходная строка представляет собой просто дату в формате «2010-08-02» (без Z), то почему бы просто:

DateTime.SpecifyKind(
    DateTime.ParseExact("2010-08-02", 
         "yyyy-MM-dd", 
         CultureInfo.InvariantCulture),
         DateTimeKind.Utc);

ParseExact, предположительно, вернет DateTime с Kind = Unspecified, и вы можете сделать его UTC или Local, как вы хотите, используя SpecifyKind.

...