我想用.NET的DateTime结构解析一个ISO8601格式的日期/时间字符串。用DateTime解析ISO8601日期/时间struct
为了让我充分认识到这个问题,我将使用.NET和JavaScript进行测试。我目前在英国(英国夏令时,即UTC + 01:00)。
我ISO8601的理解是:
- 当字符串后缀为 “Z”,时间是UTC表示。
- 当字符串后缀为“+/- hh:mm”时,时间用 表示当地时间,其中“+/- hh:mm”表示与UTC的偏移量。
考虑以下ISO8601日期/时间格式字符串:
"1987-01-05T08:45:30.500+0100"
鉴于以上我的观点,这个字符串表示的“8时45分三十〇秒”本地时间和UTC时间“7点45分三十秒”
当前时区测试(.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)一样。结果对冬天来说是正确的,当我改变我的时间/地区时也是正确的。但现在这是不正确的“任何”我在英国测试过的机器。
我认为'+ 0100'被忽略,它可能取决于本地计算机上的'区域设置'。我测试了代码,它显示了我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时间1。 –