我正在研究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"
它在解析过程中做了什么,它将偏移量设置为本地计算机时区中给定时间段的实际偏移量,并通过初始偏移量和生成的偏移量之间的增量调整小时数。 无论我提供什么作为DateTimeStyles
选项,它都这样做。结果值的类型设置为Local
,无论是否提供Roundtrip
值也不论。 所以问题是为什么默认设置为Local
,第二个问题是DateTime
存储的偏移量,如果它存储它,为什么我们需要DateTimeOffset
类?
日期时间只能存储UTC或本地时间。因此,如果字符串指定时区偏移量,则其Parse()方法必须执行* something *。你看到一个合理的选择,你没有指定DateTimeStyles.AdjustToUniversal。如果你需要知道偏移量,那么你当然必须使用DateTimeOffset.Parse()。至少有一个理由你为什么需要它。 –
@HansPassant我很惊讶,DateTime实际上可以存储偏移量。它是否作为TimeSpan存储在内部,难道你不知道吗?然后有趣的问题(虽然我觉得这是一个修辞问题)是为什么DateTimeOffset被引入的情况下DateTime本身以某种方式试图处理偏移? – EngineerSpock
它不存储偏移量。它使用2位来跟踪DateTimeKind。 Parse()方法足够聪明以处理字符串中的偏移量与DateTime可以存储的内容无关。 –