gpt4 book ai didi

c# - DateTime.Parse ("2012-09-30T23:00:00.0000000Z") 总是转换为 DateTimeKind.Local

转载 作者:IT王子 更新时间:2023-10-29 03:46:28 26 4
gpt4 key购买 nike

我想解析一个代表 UTC 格式的日期时间的字符串。

我的字符串表示包括祖鲁时间规范,该规范应指示该字符串表示 UTC 时间。

var myDate = DateTime.Parse("2012-09-30T23:00:00.0000000Z");    

从上面我希望 myDate.Kind 是 DateTimeKind.Utc,而不是 DatetimeKind.Local。

我做错了什么以及如何解析代表 UTC 时间的字符串?

非常感谢!

最佳答案

我会用我的 Noda Time个人项目。 (不可否认,我作为作者有偏见,但它会更干净......)但是如果你不能那样做......

要么使用 DateTime.ParseExact 指定您期望的确切格式,并在解析代码中包含 DateTimeStyles.AssumeUniversalDateTimeStyles.AdjustToUniversal:

using System;
using System.Globalization;

class Test
{
static void Main()
{
var date = DateTime.ParseExact("2012-09-30T23:00:00.0000000Z",
"yyyy-MM-dd'T'HH:mm:ss.fffffff'Z'",
CultureInfo.InvariantCulture,
DateTimeStyles.AssumeUniversal |
DateTimeStyles.AdjustToUniversal);
Console.WriteLine(date);
Console.WriteLine(date.Kind);
}
}

(为什么默认情况下它会在没有 AdjustToUniversal 的情况下调整为本地,这超出了我的理解,但没关系......)

编辑:为了进一步说明我对 mattytommo 的建议的反对意见,我旨在证明它会丢失信息。到目前为止,我失败了——但以一种非常奇特的方式。看看这个 - 在欧洲/伦敦时区运行,时钟回到 2012 年 10 月 28 日,本地时间凌晨 2 点(世界标准时间凌晨 1 点):

DateTime local1 = DateTime.Parse("2012-10-28T00:30:00.0000000Z");
DateTime local2 = DateTime.Parse("2012-10-28T01:30:00.0000000Z");
Console.WriteLine(local1 == local2); // True

DateTime utc1 = TimeZoneInfo.ConvertTimeToUtc(local1);
DateTime utc2 = TimeZoneInfo.ConvertTimeToUtc(local2);
Console.WriteLine(utc1 == utc2); // False. Hmm.

看起来某个地方存储了一个“带或不带夏令时”标志,但如果我能找出位置,我会感到震惊。 TimeZoneInfo.ConvertTimeToUtc 的文档状态

If dateTime corresponds to an ambiguous time, this method assumes that it is the standard time of the source time zone.

在转换 local2 时,似乎不是这种情况...

编辑:好吧,它变得更奇怪了——这取决于你使用的是哪个版本的框架。考虑这个程序:

using System;
using System.Globalization;

class Test
{
static void Main()
{
DateTime local1 = DateTime.Parse("2012-10-28T00:30:00.0000000Z");
DateTime local2 = DateTime.Parse("2012-10-28T01:30:00.0000000Z");

DateTime utc1 = TimeZoneInfo.ConvertTimeToUtc(local1);
DateTime utc2 = TimeZoneInfo.ConvertTimeToUtc(local2);
Console.WriteLine(utc1);
Console.WriteLine(utc2);

DateTime utc3 = local1.ToUniversalTime();
DateTime utc4 = local2.ToUniversalTime();
Console.WriteLine(utc3);
Console.WriteLine(utc4);
}
}

所以这需要两个不同 UTC 值,使用DateTime.Parse 解析它们,然后以两种不同的方式将它们转换回 UTC。

.NET 3.5 下的结果:

28/10/2012 01:30:00 // Look - we've lost information
28/10/2012 01:30:00
28/10/2012 00:30:00 // But ToUniversalTime() seems okay...
28/10/2012 01:30:00

.NET 4.5 beta 下的结果:

28/10/2012 00:30:00 // It's okay!
28/10/2012 01:30:00
28/10/2012 00:30:00
28/10/2012 01:30:00

关于c# - DateTime.Parse ("2012-09-30T23:00:00.0000000Z") 总是转换为 DateTimeKind.Local,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10029099/

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