从标准DateTime格式到UTC的转换如何工作?
DateTime
更具体地说,如果我DateTime在一个时区中创建一个对象,然后切换到另一个时区并ToUniversalTime()在其上运行,它如何知道转换已正确完成并且该时间仍能准确表示?
ToUniversalTime()
没有附加到DateTime对象的隐式时区。如果ToUniversalTime()在其上运行,它将使用运行代码的上下文的时区。
例如,如果我DateTime从1970年1月1日这个时代创建一个,那么DateTime无论我在世界的哪个角落,它都给我相同的对象。
如果我ToUniversalTime()在格林威治中运行代码时在其上运行,那么我得到的时间是相同的。如果我在温哥华居住时这样做,那么我得到的偏移DateTime对象为-8小时。
这就是为什么在需要进行任何类型的日期转换或本地化时,将与时间相关的信息作为UTC时间存储在数据库中很重要的原因。考虑您的代码库是否已在另一个时区移至服务器设施;)
编辑:Joel的答案的注释- DateTime默认情况下,对象的类型为DateTimeKind.Local。如果您解析日期并将其设置为DateTimeKind.Utc,则不ToUniversalTime()执行任何转换。
DateTimeKind.Local
DateTimeKind.Utc
这是有关“用日期时间编码的最佳做法”的文章,以及有关用.Net转换日期时间的文章。