gpt4 book ai didi

c# - 日期时间滴答构造时钟前进潜在的错误

转载 作者:行者123 更新时间:2023-12-04 07:19:32 26 4
gpt4 key购买 nike

有一个DateTime constructor这允许您使用 long ticks 构建它和一个 DateTimeKind .文档表明刻度代表自固定点以来的时间。 kind指示它是代表本地、UTC 还是未指定的 DateTime。
这个问题特别与时钟前进的时间有关。让我们从选择这样一个时间开始(我在英国,这是今年时钟向前推进的日期):

        var original = new DateTime(2021, 3, 28, 1, 20, 0, DateTimeKind.Utc);
long ticks = original.Ticks;
我想要给定值 ticks 的本地时间,所以我是这样做的:
        var createdAsLocal = new DateTime(ticks, DateTimeKind.Local);
但是,这最终给了我一个无效的日期时间......它给了我一个“2021-03-28 01:20:00”的日期时间,并将种类设置为本地。从某种意义上说它实际上不可能存在是无效的,因为就本地时间而言,凌晨1点变成凌晨2点,两者之间没有本地时间……框架没有提示,程序没有问题直到我尝试用那个值(value)做某些事情。
看起来我应该这样做:
        var createdAsUtc = new DateTime(ticks, DateTimeKind.Utc);
var createdAsUtcThenMadeLocal = createdAsUtc.ToLocalTime();
这给了我不同的值(value)。因此,在我看来,将此构造函数与 DateTimeKind.Utc 以外的任何东西一起使用不太可能是健壮的。
也许我误解了一些东西。谁能解释为什么 createdAsLocal具有与 createdAsUtcThenMadeLocal 不同的值?

最佳答案

那个构造函数就是:一个构造函数。 它不是为了做任何转换而设计的,它只是为了人为地构建一个已知的 ticks具有关联 DateTimeKind 的值.假定您知道这是一个有效值。
The code for the constructor (稍加验证)很简单:

this.dateData = ((UInt64)ticks | ((UInt64)kind << KindShift));

如果你想转换为本地时间,那么是的,你需要使用 ToLocalTime() ,为此您需要预先构建的 UTC 时间进行转换。
但请注意,以这种方式转换为本地时间在当时可能无效。它使用当前设置来计算时区,而不是当时计算时区的方式。获得有效本地时间的唯一方法是使用 DateTimeOffset .

关于c# - 日期时间滴答构造时钟前进潜在的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68592064/

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