C# 日期时间和偏移精细度
我正在研究C# 日期时间和偏移精细度,c#,datetime,C#,Datetime,我正在研究DateTime的“机制”以及BCL中的相关类。 我对以下奇怪的行为感兴趣。考虑下面的代码片段: var dt1 = new DateTime(2014, 10, 24, 15, 30, 00, DateTimeKind.Unspecified); DateTimeOffset dto2 = new DateTimeOffset(dt1, TimeSpan.FromHours(6)); string input = dto2.ToString("o"); DateTime dt6 =
DateTime
的“机制”以及BCL
中的相关类。
我对以下奇怪的行为感兴趣。考虑下面的代码片段:
var dt1 = new DateTime(2014, 10, 24, 15, 30, 00, DateTimeKind.Unspecified);
DateTimeOffset dto2 = new DateTimeOffset(dt1, TimeSpan.FromHours(6));
string input = dto2.ToString("o");
DateTime dt6 = DateTime.Parse(input, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind);
Console.WriteLine("DT6:" + dt6.ToString("o"));
我知道我应该将字符串解析为DateTimeOffset
,但我只是想知道为什么库允许我在这里做这些事情,最有趣的是为什么输出会是:“DT6:2014-10-24T13:30:00.00000000+04:00”
在解析过程中,它将偏移量设置为本地机器时区中给定时间段的实际偏移量,并根据初始偏移量和结果偏移量之间的增量调整小时数。
无论我作为datetimestyle
选项提供什么,它都会这样做。结果值的类型设置为Local
,也不管我是否提供往返
值。
所以问题是为什么默认情况下它将种类设置为Local
,第二个问题是DateTime
在哪里存储偏移量,如果它存储偏移量,为什么我们需要DateTimeOffset
类?有几件事:
和DateTime
都是结构,而不是类。是的DateTimeOffset
- 您的问题归结为理解
方法的行为,而不是DateTime.Parse
结构。我建议用那种方法读书。这里有很多很好的信息来描述你所看到的行为的微妙之处DateTime
- 文档对退货类型(我的重点)有这样的描述:
通常,Parse方法返回一个DateTime对象,其Kind属性为
。但是,解析方法也可以执行时区转换,并根据DateTimeKind.Unspecified
和s
参数的值,以不同方式设置种类属性的值: 您正在样式
参数中传递一个值s
,该值包含一个时区偏移量,因此您会受到图表中第一行的影响,结果会转换为您机器的本地时区,不管是什么“2014-10-24T15:30:00.0000000+06:00”
标志在这里不会有任何影响。只有当您的输入以DateTimeStyles.RoundTripKind
结束而不是偏移量结束时,您才会看到效果,如上面图表中的第三行。在这种情况下,Z
标志确保RoundTripKind
。没有它,您仍然可以获得DateTimeKind.Utc
DateTimeKind.Local
- 不存储偏移量。
中存储的唯一内容是将DateTime
和Ticks
属性组合成一个值 有趣的是,请注意,由于此字段的两位是为种类保留的,因此有四种可能的状态,即使只有三个Kind
值公开。事实上,还有一种隐藏的第四种,在和中的“DateTime的深层黑暗秘密”中描述。(基本上,它是DateTimeKind
的变体)DateTimeKind.Local
TimeZoneInfo.Local.GetUtcOffset
(或一个快捷等效的IIRC)。是的,我也总是混淆结构/类。有时候我只是说“对象”,这样我就不用想太多了。尤其是在谈论其他不一定有课程的语言时