C# 给定DateTime对象,如何获取字符串格式的ISO 8601日期?

C# 给定DateTime对象,如何获取字符串格式的ISO 8601日期?,c#,datetime,datetime-format,iso8601,C#,Datetime,Datetime Format,Iso8601,鉴于: 如何获取以兼容格式表示相同值的字符串 请注意,ISO 8601定义了许多类似的格式。我正在寻找的具体格式是: DateTime.UtcNow 返回类似于2008-04-10T06:30:00的内容 UtcNow显然会返回一个时间,因此在以下方面没有任何危害: DateTime.UtcNow.ToString("s") 读者注意:一些评论者指出了这个答案中的一些问题(特别是与第一个建议有关)。有关更多信息,请参阅评论部分 这将为您提供类似于2008-09-22T13:57:31.231

鉴于:

如何获取以兼容格式表示相同值的字符串

请注意,ISO 8601定义了许多类似的格式。我正在寻找的具体格式是:

DateTime.UtcNow
返回类似于2008-04-10T06:30:00的内容

UtcNow
显然会返回一个时间,因此在以下方面没有任何危害:

DateTime.UtcNow.ToString("s")
读者注意:一些评论者指出了这个答案中的一些问题(特别是与第一个建议有关)。有关更多信息,请参阅评论部分

这将为您提供类似于2008-09-22T13:57:31.2311892-04:00的日期

另一种方式是:

DateTime.UtcNow.ToString("yyyy-MM-ddTHH\\:mm\\:ss.fffffffzzz");
这给了你2008-09-22T14:01:54.9571247Z

要获取指定的格式,可以使用:

DateTime.UtcNow.ToString("o");

DateTime.UtcNow.ToString(“s”,System.Globalization.CultureInfo.InvariantCulture)
应该为您提供所需的内容,因为“s”格式说明符被描述为可排序的日期/时间模式;符合ISO 8601


编辑:要根据OP的要求在末尾获得额外的
Z
,请使用
“o”
而不是
“s”

将DateTime.UtcNow转换为yyyy-MM ddTHH:MM:ssZ的字符串表示形式,您可以使用带有自定义格式字符串的DateTime结构的ToString()方法。使用带有日期时间的自定义格式字符串时,请务必记住,需要使用单引号转义分隔符

以下内容将返回所需的字符串表示:

DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ")
我只想使用:

它将自动保留时区

标准格式说明符表示由属性定义的自定义日期和时间格式字符串。该模式反映定义的标准(ISO 8601),并且该属性是只读的。因此,无论所使用的区域性或提供的格式提供程序如何,它都是相同的。自定义格式字符串是
“yyyy”-“MM”-“dd'T'HH”:“MM”:“ss”

使用此标准格式说明符时,格式化或解析操作始终使用不变区域性

–从

使用:

XmlConvert.ToString(DateTime.UtcNow, XmlDateTimeSerializationMode.RoundtripKind);
资料来源:
  • (MSDN)

  • (MSDN)


如果您的开发级别低于或高于此级别,则可以使用

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
=>

您可以通过以下代码获得“Z”(UTC):

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

原因如下:

ISO 8601有一些不同的格式:

DateTimeKind.Local

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

2009-06-15T13:45:30.0000000-07:00
DateTimeKind.未指定

2009-06-15T13:45:30.0000000Z

.NET为我们提供了具有以下选项的枚举:

2009-06-15T13:45:30.0000000
注意:如果将VisualStudio2008“watch utility”应用于toString(“o”)部分,可能会得到不同的结果,我不知道这是否是错误,但在这种情况下,如果正在调试,则使用字符串变量会获得更好的结果


来源:(MSDN)

这些答案中的大多数都有毫秒/微秒,这显然不受ISO8601支持。正确答案是:

'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")
参考资料:


您有几个选项,包括“往返(“O”)格式说明符”

输出

var date1 = new DateTime(2008, 3, 1, 7, 0, 0);
Console.WriteLine(date1.ToString("O"));
Console.WriteLine(date1.ToString("s", System.Globalization.CultureInfo.InvariantCulture));
但是,DateTime+时区可能会出现博客文章中描述的其他问题:

DateTime中有无数陷阱,这些陷阱旨在给您的代码带来错误:

1.-带有DateTimeKind.Unspecified的DateTime值是坏消息

2.-DateTime在进行比较时不关心UTC/Local

3.-DateTime值不知道标准格式字符串

4.-解析带有日期时间的UTC标记的字符串不能保证UTC时间


有趣的是,自定义格式“yyyy-MM-ddTHH:MM:ssK”(不带ms)是最快的格式方法

同样有趣的是,“S”格式在经典上速度慢,在核心上速度快

当然,数字非常接近,某些行之间的差异不显著(带有后缀
\u验证
的测试与没有后缀的测试相同,证明结果的可重复性)

代码:

公共类基准DateTimeFormat
{
public static DateTime DateTime=DateTime.Now;
[基准]
公共字符串CustomDev1()
{
var d=dateTime.ToUniversalTime();
var sb=新的StringBuilder(20);
sb.追加(d.年)。追加(“-”;

如果(d.Month格式类似于2018-06-22T13:04:16,可以在API使用的URI中传递:

    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;
        }
    }
注意:根据您在终端上进行的转换,您将使用第一行(最像它)或第二行

确保仅在本地时间应用格式,因为“zzz”是UTC转换的时区信息


令人惊讶的是,没有人提出:

System.DateTime.UtcNow.ToString(“u”).Replace(“”,'T’)
#使用PowerShell核心进行演示
#小写“u”格式
[系统日期时间]::UtcNow.ToString(“u”)
>2020-02-06 01:00:32Z
#带替换的小写“u”格式
[系统日期时间]::UtcNow.ToString(“u”).替换(“”,'T')
>2020-02-06T01:00:32Z
它几乎能让你一路得到你想要的东西(这更像是一种表现)


增加: 我决定使用答案中的基准来比较它的性能

tl:dr;虽然价格昂贵,但在我那台破旧的笔记本电脑上仍然只有半毫秒多一点:-)

实施:

[基准测试]
公共字符串ReplaceU()
{
var text=dateTime.ToUniversalTime().ToString(“u”).Replace(“”,'T');
返回文本;
}
结果:

DateTime.Now.ToString("yyyy-MM-dd'T'HH:mm:ss zzz");

DateTime.Now.ToString("O");

使用Newtonsoft.Json,您可以

// * Summary *

BenchmarkDotNet=v0.11.5, OS=Windows 10.0.19002
Intel Xeon CPU E3-1245 v3 3.40GHz, 1 CPU, 8 logical and 4 physical cores
.NET Core SDK=3.0.100
  [Host]     : .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), 64bit RyuJIT
  DefaultJob : .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), 64bit RyuJIT


|               Method |     Mean |     Error |    StdDev |
|--------------------- |---------:|----------:|----------:|
|           CustomDev1 | 562.4 ns | 11.135 ns | 10.936 ns |
|           CustomDev2 | 525.3 ns |  3.322 ns |  3.107 ns |
|     CustomDev2WithMS | 609.9 ns |  9.427 ns |  8.356 ns |
|              FormatO | 356.6 ns |  6.008 ns |  5.620 ns |
|              FormatS | 589.3 ns |  7.012 ns |  6.216 ns |
|       FormatS_Verify | 599.8 ns | 12.054 ns | 11.275 ns |
|        CustomFormatK | 549.3 ns |  4.911 ns |  4.594 ns |
| CustomFormatK_Verify | 539.9 ns |  2.917 ns |  2.436 ns |
|             ReplaceU | 615.5 ns | 12.313 ns | 11.517 ns |

// * Hints *
Outliers
  BenchmarkDateTimeFormat.CustomDev2WithMS: Default     -> 1 outlier  was  removed (668.16 ns)
  BenchmarkDateTimeFormat.FormatS: Default              -> 1 outlier  was  removed (621.28 ns)
  BenchmarkDateTimeFormat.CustomFormatK: Default        -> 1 outlier  was  detected (542.55 ns)
  BenchmarkDateTimeFormat.CustomFormatK_Verify: Default -> 2 outliers were removed (557.07 ns, 560.95 ns)

// * Legends *
  Mean   : Arithmetic mean of all measurements
  Error  : Half of 99.9% confidence interval
  StdDev : Standard deviation of all measurements
  1 ns   : 1 Nanosecond (0.000000001 sec)

// ***** BenchmarkRunner: End *****


示例:

如其他答案中所述,
DateTime
在设计上存在问题

点头时间 我建议使用来管理日期/时间值:

  • 当地时间,,
    2009-06-15T13:45:30.0000000
    
    '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")
    
    System.DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ssK");
    // or
    System.DateTime.Now.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssK");
    
    var date1 = new DateTime(2008, 3, 1, 7, 0, 0);
    Console.WriteLine(date1.ToString("O"));
    Console.WriteLine(date1.ToString("s", System.Globalization.CultureInfo.InvariantCulture));
    
    2008-03-01T07:00:00.0000000
    2008-03-01T07:00:00
    
    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;
            }
        }
    
    public static string FormatDateTime(DateTime dateTime)
    {
        return dateTime.ToString("s", System.Globalization.CultureInfo.InvariantCulture);
    }
    
    DateTime.Now.ToString("yyyy-MM-dd'T'HH:mm:ss zzz");
    
    DateTime.Now.ToString("O");
    
    // * Summary *
    
    BenchmarkDotNet=v0.11.5, OS=Windows 10.0.19002
    Intel Xeon CPU E3-1245 v3 3.40GHz, 1 CPU, 8 logical and 4 physical cores
    .NET Core SDK=3.0.100
      [Host]     : .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), 64bit RyuJIT
      DefaultJob : .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), 64bit RyuJIT
    
    
    |               Method |     Mean |     Error |    StdDev |
    |--------------------- |---------:|----------:|----------:|
    |           CustomDev1 | 562.4 ns | 11.135 ns | 10.936 ns |
    |           CustomDev2 | 525.3 ns |  3.322 ns |  3.107 ns |
    |     CustomDev2WithMS | 609.9 ns |  9.427 ns |  8.356 ns |
    |              FormatO | 356.6 ns |  6.008 ns |  5.620 ns |
    |              FormatS | 589.3 ns |  7.012 ns |  6.216 ns |
    |       FormatS_Verify | 599.8 ns | 12.054 ns | 11.275 ns |
    |        CustomFormatK | 549.3 ns |  4.911 ns |  4.594 ns |
    | CustomFormatK_Verify | 539.9 ns |  2.917 ns |  2.436 ns |
    |             ReplaceU | 615.5 ns | 12.313 ns | 11.517 ns |
    
    // * Hints *
    Outliers
      BenchmarkDateTimeFormat.CustomDev2WithMS: Default     -> 1 outlier  was  removed (668.16 ns)
      BenchmarkDateTimeFormat.FormatS: Default              -> 1 outlier  was  removed (621.28 ns)
      BenchmarkDateTimeFormat.CustomFormatK: Default        -> 1 outlier  was  detected (542.55 ns)
      BenchmarkDateTimeFormat.CustomFormatK_Verify: Default -> 2 outliers were removed (557.07 ns, 560.95 ns)
    
    // * Legends *
      Mean   : Arithmetic mean of all measurements
      Error  : Half of 99.9% confidence interval
      StdDev : Standard deviation of all measurements
      1 ns   : 1 Nanosecond (0.000000001 sec)
    
    // ***** BenchmarkRunner: End *****
    
    
    JsonConvert.SerializeObject(DateTime.UtcNow)
    
    var instant1 = Instant.FromUtc(2020, 06, 29, 10, 15, 22);
    
    var utcZonedDateTime = new ZonedDateTime(instant1, DateTimeZone.Utc);
    utcZonedDateTime.ToString("yyyy-MM-ddTHH:mm:ss'Z'", CultureInfo.InvariantCulture);
    // 2020-06-29T10:15:22Z
    
    
    var instant2 = Instant.FromDateTimeUtc(new DateTime(2020, 06, 29, 10, 15, 22, DateTimeKind.Utc));
    
    var amsterdamZonedDateTime = new ZonedDateTime(instant2, DateTimeZoneProviders.Tzdb["Europe/Amsterdam"]);
    amsterdamZonedDateTime.ToString("yyyy-MM-ddTHH:mm:ss'Z'", CultureInfo.InvariantCulture);
    // 2020-06-29T12:15:22Z
    
    
    services
        .AddMvc()
        .AddJsonOptions(options =>
        {
            var settings=options.SerializerSettings;
            settings.DateParseHandling = DateParseHandling.None;
            settings.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
        });