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

Дано:

DateTime.UtcNow

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

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

yyyy-MM-ddTHH:mm:ssZ

вопрос задан 22.09.2008
Iain
4313 репутация

15 ответов


  • 623 рейтинг
    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

    ответ дан Wayne, с репутацией 25946, 22.09.2008
  • 277 рейтинг

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

    ответ дан Simon Wilson, с репутацией 6318, 22.09.2008
  • 60 рейтинг
    DateTime.UtcNow.ToString("s")
    

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

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

    нет
    string.Concat(DateTime.UtcNow.ToString("s"), "Z")
    
    ответ дан Iain, с репутацией 4313, 22.09.2008
  • 25 рейтинг

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

    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
    

    Источники:

    ответ дан Don, с репутацией 449, 17.09.2012
  • 19 рейтинг
    System.DateTime.UtcNow.ToString("o")
    

    = & gt;

    val it : string = "2013-10-13T13:03:50.2950037Z"
    
    ответ дан Henrik, с репутацией 6688, 13.10.2013
  • 18 рейтинг

    Вы можете получить «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. Местный

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

    DateTimeKind. Utc

    2009-06-15T13:45:30.0000000Z
    

    DateTimeKind. Не указано

    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 "watch watch" к toString ("o") , вы можете получить другие результаты, я не знаю, если это ошибка, но в этом случае вам лучше результаты с использованием строковой переменной, если вы отлаживаете.

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

    ответ дан Oaxas, с репутацией 279, 17.09.2014
  • 18 рейтинг

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

    2015-07-06T12:08:27
    

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

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

    1. - Значения DateTime с DateTimeKind. Не указано плохие новости.

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

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

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

    ответ дан Alex Nolasco, с репутацией 13435, 6.07.2015
  • 15 рейтинг

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

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

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

    ответ дан Sumrak, с репутацией 1952, 2.06.2011
  • 9 рейтинг

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

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

    Справочные материалы:

    ответ дан Justin Turner, с репутацией 315, 5.12.2014
  • 8 рейтинг

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

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

    DateTime.UtcNow.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'", DateTimeFormatInfo.InvariantInfo)
    
    ответ дан Oppositional, с репутацией 8883, 26.11.2008
  • 7 рейтинг

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

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

    - от MSDN

    ответ дан Amal, с репутацией 192, 12.09.2012
  • 5 рейтинг

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

    Также интересно, что формат "S" медленный на классическом и быстрый на ядре. , ,

    Конечно, числа очень близки, разница между некоторыми строками незначительна (тесты с суффиксом _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 был использован

    ответ дан Roman Pokrovskij, с репутацией 3489, 4.05.2017
  • 3 рейтинг
    DateTime.Now.ToString("yyyy-MM-dd'T'HH:mm:ss zzz");
    
    DateTime.Now.ToString("O");
    

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

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

    image

    ответ дан PSM, с репутацией 31, 30.08.2018
  • 1 рейтинг

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

    using Microsoft.SharePoint;
    using Microsoft.SharePoint.Utilities;
    ...
    string strISODate = SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.Now)
    
    ответ дан Simon Logic, с репутацией 67, 27.03.2013
  • 0 рейтинг

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

    public static string FormatDateTime(DateTime dateTime)
    {
        return dateTime.ToString("s", System.Globalization.CultureInfo.InvariantCulture);
    }
    
    ответ дан nfgallimore, с репутацией 177, 22.06.2018