Учитывая объект DateTime, как я могу получить дату ISO 8601 в строковом формате? - PullRequest
696 голосов
/ 22 сентября 2008

Дано:

DateTime.UtcNow

Как получить строку, представляющую то же значение в ISO 8601 -форматном формате?

Обратите внимание, что ISO 8601 определяет ряд похожих форматов. Конкретный формат, который я ищу:

yyyy-MM-ddTHH:mm:ssZ

Ответы [ 17 ]

693 голосов
/ 22 сентября 2008

Примечание для читателей: Несколько комментаторов указали на некоторые проблемы в этом ответе (особенно связанные с первым предложением). Обратитесь к разделу комментариев для получения дополнительной информации.

DateTime.UtcNow.ToString("yyyy-MM-ddTHH\\:mm\\:ss.fffffffzzz");

Это дает вам дату, подобную 2008-09-22T13: 57: 31.2311892-04: 00 .

Другой способ:

DateTime.UtcNow.ToString("o");

, что дает вам 2008-09-22T14: 01: 54.9571247Z

Чтобы получить указанный формат, вы можете использовать:

DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ")

Параметры форматирования даты и времени

316 голосов
/ 22 сентября 2008

DateTime.UtcNow.ToString("s", System.Globalization.CultureInfo.InvariantCulture) должно дать вам то, что вы ищете, так как спецификатор формата "s" описывается как сортируемый шаблон даты / времени; соответствует ISO 8601.

68 голосов
/ 22 сентября 2008
DateTime.UtcNow.ToString("s")

Возвращает что-то вроде 2008-04-10T06: 30: 00

UtcNow, очевидно, возвращает UTC время, поэтому нет никакого вреда в:

string.Concat(DateTime.UtcNow.ToString("s"), "Z")
30 голосов
/ 18 сентября 2012

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

private void TimeFormats()
{
    DateTime localTime = DateTime.Now;
    DateTime utcTime = DateTime.UtcNow;
    DateTimeOffset localTimeAndOffset = new DateTimeOffset(localTime, TimeZoneInfo.Local.GetUtcOffset(localTime));

    //UTC
    string strUtcTime_o = utcTime.ToString("o");
    string strUtcTime_s = utcTime.ToString("s");
    string strUtcTime_custom = utcTime.ToString("yyyy-MM-ddTHH:mm:ssK");

    //Local
    string strLocalTimeAndOffset_o = localTimeAndOffset.ToString("o");
    string strLocalTimeAndOffset_s = localTimeAndOffset.ToString("s");
    string strLocalTimeAndOffset_custom = utcTime.ToString("yyyy-MM-ddTHH:mm:ssK");

    //Output
    Response.Write("<br/>UTC<br/>");
    Response.Write("strUtcTime_o: " + strUtcTime_o + "<br/>");
    Response.Write("strUtcTime_s: " + strUtcTime_s + "<br/>");
    Response.Write("strUtcTime_custom: " + strUtcTime_custom + "<br/>");

    Response.Write("<br/>Local Time<br/>");
    Response.Write("strLocalTimeAndOffset_o: " + strLocalTimeAndOffset_o + "<br/>");
    Response.Write("strLocalTimeAndOffset_s: " + strLocalTimeAndOffset_s + "<br/>");
    Response.Write("strLocalTimeAndOffset_custom: " + strLocalTimeAndOffset_custom + "<br/>");

}

OUTPUT

UTC
    strUtcTime_o: 2012-09-17T22:02:51.4021600Z
    strUtcTime_s: 2012-09-17T22:02:51
    strUtcTime_custom: 2012-09-17T22:02:51Z

Local Time
    strLocalTimeAndOffset_o: 2012-09-17T15:02:51.4021600-07:00
    strLocalTimeAndOffset_s: 2012-09-17T15:02:51
    strLocalTimeAndOffset_custom: 2012-09-17T22:02:51Z

Источники:

23 голосов
/ 13 октября 2013
System.DateTime.UtcNow.ToString("o")

=>

val it : string = "2013-10-13T13:03:50.2950037Z"
21 голосов
/ 17 сентября 2014

Вы можете получить «Z» ( ISO 8601 UTC ) со следующим кодом:

Dim tmpDate As DateTime = New DateTime(Now.Ticks, DateTimeKind.Utc)
Dim res as String = tmpDate.toString("o") '2009-06-15T13:45:30.0000000Z


Вот почему:

ISO 8601 имеет несколько различных форматов:

DateTimeKind.Local

2009-06-15T13:45:30.0000000-07:00

DateTimeKind.Utc

2009-06-15T13:45:30.0000000Z

DateTimeKind.Unspecified

2009-06-15T13:45:30.0000000


.NET предоставляет нам перечисление с этими опциями:

'2009-06-15T13:45:30.0000000-07:00
Dim strTmp1 As String = New DateTime(Now.Ticks, DateTimeKind.Local).ToString("o")

'2009-06-15T13:45:30.0000000Z
Dim strTmp2 As String = New DateTime(Now.Ticks, DateTimeKind.Utc).ToString("o")

'2009-06-15T13:45:30.0000000
Dim strTmp3 As String = New DateTime(Now.Ticks, DateTimeKind.Unspecified).ToString("o")

Примечание : если вы примените "служебную программу наблюдения" Visual Studio 2008 к части toString ("o") , вы можете получить другие результаты, я не знаю, если это ошибка, но в этом случае вы получите лучшие результаты, если будете использовать отладочную переменную.

Источник: Стандартные строки формата даты и времени (MSDN)

20 голосов
/ 06 июля 2015

Если вы должны использовать DateTime для ISO 8601, то ToString ("o") должно дать то, что вы ищете. Например,

2015-07-06T12:08:27

Однако DateTime + TimeZone могут представлять другие проблемы, как описано в сообщении в блоге DateTime и DateTimeOffset в .NET: передовая практика и распространенные ошибки :

DateTime содержит бесчисленное количество ловушек, предназначенных для того, чтобы выдавать ошибки в вашем коде:

1.- Значения DateTime с DateTimeKind.Unspecified - плохие новости.

2.- DateTime не заботится о UTC / Local при сравнении.

3.- Значения DateTime не учитывают строки стандартного формата.

4.- Анализ строки, имеющей маркер UTC с DateTime, не гарантирует время UTC.

16 голосов
/ 02 июня 2011

Я бы просто использовал XmlConvert:

XmlConvert.ToString(DateTime.UtcNow, XmlDateTimeSerializationMode.RoundtripKind);

Он автоматически сохранит часовой пояс.

14 голосов
/ 05 декабря 2014

Большинство этих ответов имеют миллисекунды / микросекунды, что явно не поддерживается ISO 8601. Правильный ответ будет:

System.DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ssK");
// or
System.DateTime.Now.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssK");

Ссылки:

9 голосов
/ 27 ноября 2008

Чтобы преобразовать DateTime.UtcNow в строковое представление гггг-мм-ддТЧ: мм: ссЗ , вы можете использовать метод ToString () структуры DateTime с пользовательской строкой форматирования. При использовании строк нестандартного формата с DateTime важно помнить, что вам нужно экранировать разделители, используя одинарные кавычки.

Следующая строка вернет желаемое строковое представление:

DateTime.UtcNow.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'", DateTimeFormatInfo.InvariantInfo)
...