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

Данный:

DateTime.UtcNow 

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

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

 yyyy-MM-ddTHH:mm:ssZ 

 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") 

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

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

 DateTime.UtcNow.ToString("s") 

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

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

 string.Concat(DateTime.UtcNow.ToString("s"), "Z") 

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

 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("
UTC
"); Response.Write("strUtcTime_o: " + strUtcTime_o + "
"); Response.Write("strUtcTime_s: " + strUtcTime_s + "
"); Response.Write("strUtcTime_custom: " + strUtcTime_custom + "
"); Response.Write("
Local Time
"); Response.Write("strLocalTimeAndOffset_o: " + strLocalTimeAndOffset_o + "
"); Response.Write("strLocalTimeAndOffset_s: " + strLocalTimeAndOffset_s + "
"); Response.Write("strLocalTimeAndOffset_custom: " + strLocalTimeAndOffset_custom + "
"); }

ВЫВОД

 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 

Источники:

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

  • Пользовательские строки формата даты и времени (MSDN)

 System.DateTime.UtcNow.ToString("o") 

=>

 val it : string = "2013-10-13T13:03:50.2950037Z" 

Вы можете получить «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»), вы можете получить разные результаты, я не знаю, является ли это ошибкой, но в этом случае у вас есть лучшие результаты, используя переменную String если вы отлаживаете.

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

Если вы должны использовать 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.

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

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

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

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

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

Рекомендации:

  • Спецификация ISO 8601
  • Спецификатор “K”

Чтобы преобразовать DateTime.UtcNow в строковое представление yyyy-MM-ddTHH: mm: ssZ , вы можете использовать метод ToString () структуры DateTime с пользовательской строкой форматирования. При использовании строк пользовательского формата с использованием DateTime важно помнить, что вам нужно избегать ваших разделителей, используя одинарные кавычки.

Следующее вернет представление строки, которое вы хотели:

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

Спецификатор стандартного формата "s" представляет собой пользовательскую строку формата даты и времени, которая определяется свойством DateTimeFormatInfo.SortableDateTimePattern . Шаблон отражает определенный стандарт ( ISO 8601 ), и свойство доступно только для чтения. Поэтому он всегда один и тот же, независимо от используемой культуры или поставщика формата. Строка настраиваемого формата – "yyyy'-'MM'-'dd'T'HH':'mm':'ss" .

Когда этот стандартный спецификатор формата используется, операция форматирования или parsingа всегда использует инвариантную культуру.

– от MSDN

Интересно, что пользовательский формат «yyyy-MM-ddTHH: mm: ssK» (без ms) является самым быстрым методом форматирования.

Также интересно, что формат «S» медленный на classическом и быстром на Core …

Конечно, цифры очень близки, между некоторыми различиями строк незначительно (тесты с суффиксом _Verify такие же, как те, которые без этого суффикса, демонстрируют повторяемость результатов)

 BenchmarkDotNet=v0.10.5, OS=Windows 10.0.14393 Processor=Intel Core i5-2500K CPU 3.30GHz (Sandy Bridge), ProcessorCount=4 Frequency=3233539 Hz, Resolution=309.2587 ns, Timer=TSC [Host] : Clr 4.0.30319.42000, 64bit RyuJIT-v4.6.1637.0 Clr : Clr 4.0.30319.42000, 64bit RyuJIT-v4.6.1637.0 Core : .NET Core 4.6.25009.03, 64bit RyuJIT Method | Job | Runtime | Mean | Error | StdDev | Median | Min | Max | Rank | Gen 0 | Allocated | --------------------- |----- |-------- |-----------:|----------:|----------:|-----------:|-----------:|-----------:|-----:|-------:|----------:| CustomDev1 | Clr | Clr | 1,089.0 ns | 22.179 ns | 20.746 ns | 1,079.9 ns | 1,068.9 ns | 1,133.2 ns | 8 | 0.1086 | 424 B | CustomDev2 | Clr | Clr | 1,032.3 ns | 19.897 ns | 21.289 ns | 1,024.7 ns | 1,000.3 ns | 1,072.0 ns | 7 | 0.1165 | 424 B | CustomDev2WithMS | Clr | Clr | 1,168.2 ns | 16.543 ns | 15.474 ns | 1,168.5 ns | 1,149.3 ns | 1,189.2 ns | 10 | 0.1625 | 592 B | FormatO | Clr | Clr | 1,563.7 ns | 31.244 ns | 54.721 ns | 1,532.5 ns | 1,497.8 ns | 1,703.5 ns | 14 | 0.2897 | 976 B | FormatS | Clr | Clr | 1,243.5 ns | 24.615 ns | 31.130 ns | 1,229.3 ns | 1,200.6 ns | 1,324.2 ns | 13 | 0.2865 | 984 B | FormatS_Verify | Clr | Clr | 1,217.6 ns | 11.486 ns | 10.744 ns | 1,216.2 ns | 1,205.5 ns | 1,244.3 ns | 12 | 0.2885 | 984 B | CustomFormatK | Clr | Clr | 912.2 ns | 17.915 ns | 18.398 ns | 916.6 ns | 878.3 ns | 934.1 ns | 4 | 0.0629 | 240 B | CustomFormatK_Verify | Clr | Clr | 894.0 ns | 3.877 ns | 3.626 ns | 893.8 ns | 885.1 ns | 900.0 ns | 3 | 0.0636 | 240 B | CustomDev1 | Core | Core | 989.1 ns | 12.550 ns | 11.739 ns | 983.8 ns | 976.8 ns | 1,015.5 ns | 6 | 0.1101 | 423 B | CustomDev2 | Core | Core | 964.3 ns | 18.826 ns | 23.809 ns | 954.1 ns | 935.5 ns | 1,015.6 ns | 5 | 0.1267 | 423 B | CustomDev2WithMS | Core | Core | 1,136.0 ns | 21.914 ns | 27.714 ns | 1,138.1 ns | 1,099.9 ns | 1,200.2 ns | 9 | 0.1752 | 590 B | FormatO | Core | Core | 1,201.5 ns | 16.262 ns | 15.211 ns | 1,202.3 ns | 1,178.2 ns | 1,225.5 ns | 11 | 0.0656 | 271 B | FormatS | Core | Core | 993.5 ns | 19.272 ns | 24.372 ns | 999.4 ns | 954.2 ns | 1,029.5 ns | 6 | 0.0633 | 279 B | FormatS_Verify | Core | Core | 1,003.1 ns | 17.577 ns | 16.442 ns | 1,009.2 ns | 976.1 ns | 1,024.3 ns | 6 | 0.0674 | 279 B | CustomFormatK | Core | Core | 878.2 ns | 17.017 ns | 20.898 ns | 877.7 ns | 851.4 ns | 928.1 ns | 2 | 0.0555 | 215 B | CustomFormatK_Verify | Core | Core | 863.6 ns | 3.968 ns | 3.712 ns | 863.0 ns | 858.6 ns | 870.8 ns | 1 | 0.0550 | 215 B | 

Код:

  public class BenchmarkDateTimeFormat { public static DateTime dateTime = DateTime.Now; [Benchmark] public string CustomDev1() { var d = dateTime.ToUniversalTime(); var sb = new StringBuilder(20); sb.Append(d.Year).Append("-"); if (d.Month <= 9) sb.Append("0"); sb.Append(d.Month).Append("-"); if (d.Day <= 9) sb.Append("0"); sb.Append(d.Day).Append("T"); if (d.Hour <= 9) sb.Append("0"); sb.Append(d.Hour).Append(":"); if (d.Minute <= 9) sb.Append("0"); sb.Append(d.Minute).Append(":"); if (d.Second <= 9) sb.Append("0"); sb.Append(d.Second).Append("Z"); var text = sb.ToString(); return text; } [Benchmark] public string CustomDev2() { var u = dateTime.ToUniversalTime(); var sb = new StringBuilder(20); var y = u.Year; var d = u.Day; var M = u.Month; var h = u.Hour; var m = u.Minute; var s = u.Second; sb.Append(y).Append("-"); if (M <= 9) sb.Append("0"); sb.Append(M).Append("-"); if (d <= 9) sb.Append("0"); sb.Append(d).Append("T"); if (h <= 9) sb.Append("0"); sb.Append(h).Append(":"); if (m <= 9) sb.Append("0"); sb.Append(m).Append(":"); if (s <= 9) sb.Append("0"); sb.Append(s).Append("Z"); var text = sb.ToString(); return text; } [Benchmark] public string CustomDev2WithMS() { var u = dateTime.ToUniversalTime(); var sb = new StringBuilder(23); var y = u.Year; var d = u.Day; var M = u.Month; var h = u.Hour; var m = u.Minute; var s = u.Second; var ms = u.Millisecond; sb.Append(y).Append("-"); if (M <= 9) sb.Append("0"); sb.Append(M).Append("-"); if (d <= 9) sb.Append("0"); sb.Append(d).Append("T"); if (h <= 9) sb.Append("0"); sb.Append(h).Append(":"); if (m <= 9) sb.Append("0"); sb.Append(m).Append(":"); if (s <= 9) sb.Append("0"); sb.Append(s).Append("."); sb.Append(ms).Append("Z"); var text = sb.ToString(); return text; } [Benchmark] public string FormatO() { var text = dateTime.ToUniversalTime().ToString("o"); return text; } [Benchmark] public string FormatS() { var text = string.Concat(dateTime.ToUniversalTime().ToString("s"),"Z"); return text; } [Benchmark] public string FormatS_Verify() { var text = string.Concat(dateTime.ToUniversalTime().ToString("s"), "Z"); return text; } [Benchmark] public string CustomFormatK() { var text = dateTime.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssK"); return text; } [Benchmark] public string CustomFormatK_Verify() { var text = dateTime.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssK"); return text; } } 

https://github.com/dotnet/BenchmarkDotNet был использован

Если вы работаете в SharePoint 2010 или выше, вы можете использовать

 using Microsoft.SharePoint; using Microsoft.SharePoint.Utilities; ... string strISODate = SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.Now) 
 DateTime.Now.ToString("yyyy-MM-dd'T'HH:mm:ss zzz"); DateTime.Now.ToString("O"); 

ПРИМЕЧАНИЕ. В зависимости от того, какое преобразование вы делаете в конце, вы будете использовать первую строку (наиболее похожую на нее) или вторую.

Обязательно применяйте формат только по местному времени, так как «zzz» – это информация о часовом поясе для преобразования UTC.

образ

Для форматирования, как 2018-06-22T13: 04: 16, который может быть передан в URI для использования API:

 public static string FormatDateTime(DateTime dateTime) { return dateTime.ToString("s", System.Globalization.CultureInfo.InvariantCulture); } 
Давайте будем гением компьютера.