gpt4 book ai didi

c# - 使用 DateTime 结构解析 ISO8601 日期/时间

转载 作者:太空宇宙 更新时间:2023-11-03 10:58:49 25 4
gpt4 key购买 nike

我正在尝试使用 .NET 的 DateTime 结构解析 ISO8601 格式的日期/时间字符串。

为了让我全面了解问题,我将使用 .NET 和 JavaScript 执行测试。我目前在英国(英国夏令时,UTC+01:00)。

我对ISO8601的理解是:

  • 当字符串以“Z”为后缀时,时间以UTC表示。
  • 当字符串以"+/-hh:mm"为后缀时,时间表示为本地时间,其中“+/-hh:mm”表示与 UTC 的偏移量。

考虑以下 ISO8601 日期/时间格式字符串:

"1987-01-05T08:45:30.500+0100"

根据我上面的观点,这个字符串表示本地时间“08:45:30”和 UTC 时间“07:45:30”

当前时区测试 (.NET)

DateTime now = DateTime.Now;
Console.WriteLine(now.ToLocalTime()); // 27/08/2013 12:02:43
Console.WriteLine(now.ToUniversalTime()); // 27/08/2013 11:02:43

当前时区测试(JavaScript)

var now = new Date(Date.now());
now.toString(); // Tue Aug 27 2013 12:03:46 GMT+0100 (GMT Daylight Time)
now.toUTCString(); // Tue, 27 Aug 2013 11:03:46 GMT

除了两个示例之间的微小(分钟/秒)差异外,它们返回的结果与我对英国夏令时间 (UTC+01:00) 的预期完全相同。 分/秒差异是因为我无法完全同时运行 .NET 测试和 JavaScript 测试。

现在让我们使用我的 ISO8601 日期/时间格式的字符串:

解析 ISO8601 格式字符串 (.NET)

DateTime dt = DateTime.Parse("1987-01-05T08:45:30.500+0100");
Console.WriteLine(dt.ToLocalTime()); // 05/01/1987 07:45:30
Console.WriteLine(dt.ToUniversalTime()); // 05/01/1987 07:45:30

解析 ISO8601 格式字符串(JavaScript)

var dt = new Date("1987-01-05T08:45:30.500+0100");
dt.toString(); // Mon Jan 05 1987 07:45:30 GMT+0000 (GMT Standard Time)
dt.toUTCString(); //Mon, 05 Jan 1987 07:45:30 GMT

这似乎与显示日期/时间“now”的示例不一致。为什么我在英国冬令时 (UTC+00:00) 显示的是英国夏令时 (UTC+01:00) 而“现在”示例?

如果我更改我的时区设置,我会得到本地/世界时间的预期结果,但如果它们设置为我当前的时区/时区,这似乎会产生不一致的结果。

编辑:简而言之,当我尝试解析字符串时,就好像 .NET 和 JavaScript 都忽略了夏令时/英国夏令时 (UTC+01:00)。结果在冬天是正确的,而且当我物理上改变我的时区时也是正确的......但就目前而言,这在我在英国测试过的“任何”机器上是不正确的。

最佳答案

英国在夏季(8 月 27 日,示例中的“现在”)使用夏令时(将时钟提前一小时),但在冬季不使用(1 月 5 日,来自您对“1987-01-05T08:45:30.500+0100”的解析)。

实际上,英国在冬天使用 UTC。你的机器似乎有英国的 TimeZoneInfo。您可以使用 TimeZoneInfo.Local.DisplayName(自 .NET 3.5 起)或 TimeZone.CurrentTimeZone.StandardName(旧版)进行检查。

您可以使用 dt.IsDaylightSavingTime() 进行检查。

添加:

我的回答仅与 .NET 有关(但也许同样适用于 JavaScript?)。您提供的示例完全按预期工作。 1987 年 1 月的日期和时间将转换为您的本地区域,这应该是英国的,而 1987 年 1 月英国是 +0000,因为它是冬天。您提供的时间字符串带有 +0100 标记(就好像它来自德国或英国东部一小时的其他国家),并且在解析字符串时确认了这一点。 1987 年夏季的日期会正确地进行不同的转换,因为在 1987 年夏季,英国(以及所有欧洲经济共同体)遵守夏令时(夏令时)。

总结:在解释时间时会考虑偏移指示符或区域说明符 +0100 。这会在您的计算机上转换为英国时间。如果您想转换为 UTC 而不是转换为您机器的本地时间,请使用采用 DateTimeStyles 枚举并包含标志 DateTimeStyles.AdjustToUniversal 的重载。

如果您想要一个更好地表示时间绝对时区的值,请考虑使用结构DateTimeOffset 而不是DateTime。您还可以考虑 NODA 时间而不是 .NET 类型。

关于c# - 使用 DateTime 结构解析 ISO8601 日期/时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18454631/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com