gpt4 book ai didi

.net - DateTime.ToUniversalTime 和 TimeZoneInfo.ConvertTimeToUtc 之间有什么区别

转载 作者:行者123 更新时间:2023-12-02 15:09:11 24 4
gpt4 key购买 nike

我刚刚开始认真考虑推出一个网络应用程序,该应用程序需要在用户一天开始时(比如早上 6 点)为用户做一些事情。也在他们的日子结束时。

我到处都读到人们说了很多只是为了使用 .ToUniversalTime 将时间存储在 UTC 中,但是当我尝试这个(正如我怀疑的那样)时,它不起作用,它只是将时间移动了大约一个小时(我在英国,所以我认为这与 GMT 到 UTC 的一些偏移有关,尽管这对我来说没有意义,因为夏令时此时应该关闭)。

我在数据库中有一个存储用户时区的字段,因此当我开始使用 ConvertTimeToUtc 和 fromUtc 时,它开始执行我期望的操作。尽管我再次不确定我是否必须自己构建一些逻辑来进行夏令时转换,或者它应该为我做这件事。

我主要想知道为什么每个人都在谈论 .ToUniversalTime,因为它似乎确实对我没有帮助,而且我无法理解它怎么可能知道偏移多少时间以将其转换为 UTC,而第二种方式是有道理的。

有人可以解释一下每种方法有何用处吗?

最佳答案

这两者之间实际上有区别的。

在 .NET 3.5 及更低版本中,Datetime.ToUniversalTime 实现为:

public DateTime ToUniversalTime() {
return TimeZone.CurrentTimeZone.ToUniversalTime(this);
}

因为它使用了TimeZone类,所以它遇到了the MSDN docs中提到的相同问题。 :

The TimeZone class supports only a single daylight saving time adjustment rule for the local time zone. As a result, the TimeZone class can accurately report daylight saving time information or convert between UTC and local time only for the period in which the latest adjustment rule is in effect. In contrast, the TimeZoneInfo class supports multiple adjustment rules, which makes it possible to work with historic time zone data.

在 .NET 4.0 及更高版本中,Datetime.ToUniversalTime 实现为:

public DateTime ToUniversalTime() { 
return TimeZoneInfo.ConvertTimeToUtc(this, TimeZoneInfoOptions.NoThrowOnInvalidTime);
}

这解决了不支持历史调整规则的问题,但由于 NoThrowOnInvalidTime 标志,它与仅调用 TimeZoneInfo.ConvertimeToUtc< 不同/

它调用的方法是采用 TimeZoneInfoOptions 标志的 ConvertTimeToUtc内部重载。该方法的公共(public)版本使用TimeZoneInfoOptions.None,而此版本使用TimeZoneInfoOptions.NoThrowOnInvalidTime

差异可以如下说明。将时区设置为美国太平洋时间:

DateTime dt = new DateTime(2015, 3, 8, 2, 0, 0, DateTimeKind.Local);
DateTime utc = dt.ToUniversalTime();
Console.WriteLine(utc); // "3/8/2015 10:00:00 AM"

对比:

DateTime dt = new DateTime(2015, 3, 8, 2, 0, 0, DateTimeKind.Local);
DateTime utc = TimeZoneInfo.ConvertTimeToUtc(dt); // throws exception!
Console.WriteLine(utc);

自该日期起,在该时区,时间从 1:59:59 跳到 3:00:00,提供本地时间 2:00:00 无效。正确的做法是抛出异常(如第二种情况)。但是,由于早期框架版本中现有的 DateTime.ToUniversalTime 合约不允许这样做,因此框架选择返回一个值而不是抛出异常。

它选择的值是根据标准时间偏移量计算的,就好像没有发生 DST 转换一样。

关于.net - DateTime.ToUniversalTime 和 TimeZoneInfo.ConvertTimeToUtc 之间有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1704780/

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