- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚刚开始认真考虑推出一个网络应用程序,该应用程序需要在用户一天开始时(比如早上 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, theTimeZone
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, theTimeZoneInfo
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/
您好,我在将本地时间转换为 UTC 时出现异常。我运行我的应用程序在设置了“俄罗斯标准时间”的 Windows 上。 public Convert() { DateTime d
我在将日期时间转换为 UTC 时遇到问题。用户在webform中的mydate中输入日期,我们需要将其转换为UTC并存储到DB中。 用户还可以从存储在 selectedTimeZone 变量中的列表中
在我当前的任务中,我面临着日期时间计算中的一些不匹配问题。这就像用户详细信息管理。用户将有激活日期(dd/mm/yyyy)和到期日期(dd/mm/yyyy)。从 UI 中,将收集日期详细信息并将其保存
我们遇到了一个问题,一位开发人员创建了以下代码并且它可以在他的 DEV 环境中运行。但是当它被检查到 QA 时,代码中断并显示以下错误消息: myRecord.UTCStartTime = TimeZ
.NET Core 中的 ConvertTimeToUtc 发生了什么?我知道它已经不存在了,但它是否已被其他任何东西取代?这就是我以前如何获取客户的日期和时间输入,然后将其转换为 UTC 以存储在数
我刚刚开始认真考虑推出一个网络应用程序,该应用程序需要在用户一天开始时(比如早上 6 点)为用户做一些事情。也在他们的日子结束时。 我到处都读到人们说了很多只是为了使用 .ToUniversalTim
如果用户选择提前 x 小时的时区,我希望保存的日期会从屏幕上选择的日期发生变化。例如。他们从日历弹出窗口中选择 UTC+2 Athens 和日期 25/02/2016,然后记录的日期将是 24/02/
当我为这个特定的 dt 值运行代码时,当我调用 ConvertTimeToUtc 方法时抛出异常。我的本地机器 timeZoneId 是“GMT 标准时间” var tzi = TimeZoneInf
这个问题在这里已经有了答案: What is this about adjustment rules when converting DateTime to UTC? (1 个回答) 关闭 7 年前
我有一个将本地时间转换为 UTC 并将其存储在数据库中的应用程序。我在特定日期测试转换时遇到了这个问题 - 2015 年 11 月 1 日(夏令时结束的日期(时钟在到达凌晨 2 点时回到凌晨 1 点)
我是一名优秀的程序员,十分优秀!