我正在尝试使用 .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
这似乎与显示日期/时间“现在”的示例不一致。当“现在”示例以英国夏令时间 (UTC+01:00) 显示时,为什么这显示好像我在英国冬季时间 (UTC+00:00)?
如果我更改我的时区设置,我会得到本地/通用时间的预期结果,但如果它们设置为我当前的时间/区域,这似乎会给出不一致的结果。
编辑:简而言之,当我尝试解析字符串时,就好像 .NET 和 JavaScript 都忽略了夏令时/英国夏令时 (UTC+01:00)。结果在冬天是正确的,当我实际改变我的时间/区域时也是正确的……但就目前而言,这在我在英国测试过的“任何”机器上都是不正确的。