【发布时间】:2013-08-29 13:30:26
【问题描述】:
我正在尝试使用 .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+01:00) 显示时,为什么这显示好像我在英国冬季时间 (UTC+00:00)?
如果我更改我的时区设置,我会得到本地/世界时的预期结果,但如果它们设置为我当前的时间/时区,这似乎会给出不一致的结果。
编辑: 简而言之,当我尝试解析字符串时,就好像 .NET 和 JavaScript 都忽略了夏令时/英国夏令时 (UTC+01:00)。结果在冬天是正确的,当我实际改变我的时间/区域时也是正确的......但就目前而言,这在我在英国测试过的“any”机器上是不正确的。
【问题讨论】:
-
我认为
+0100被忽略了,它可能取决于本地计算机上的Regional settings。我已经测试了代码,它向我展示了07:45:30与02:45:30与您的测试不同。 -
这是您在 UTC 时区生活/编码所获得的...解析 总是 返回本地时间,但在您的情况下,UTC 和本地是无操作的。
-
其实你的代码应该是
Local: 05/01/1987 07:45:30和UTC: 05/01/1987 08:45:30,+0100只是指定时间是UTC,所以所有的本地时间都是UTC time - 1。 -
@KingKing,请看我的编辑,谢谢。
-
@series0ne 我不得不说你的例子对我来说工作正常(在我的机器上),实际上
+0100意味着实际的Local time是 1 小时少于 比UTC time(不比你想象的要大)。它只是表明time string是UTC。
标签: c# .net datetime utc iso8601