关于c#:从DateTime获取时区

Get timezone from DateTime

.NET日期时间是否包含有关创建它的时区的信息?

我有一个库,它从末尾带有"+zz"的格式分析日期时间,虽然它正确地分析和调整了本地时间,但我需要从日期时间对象中获得特定时区的内容。

这有可能吗?我只能看到datetime.kind,它指定时间是本地时间还是UTC。


日期时间本身不包含实时区域信息。它可能知道是UTC还是本地的,但不知道本地的真正含义。

datetimeoffset更好一些-基本上是一个UTC时间和一个偏移量。但是,这还不足以确定时区,因为许多不同的时区在任何一个时间点都可以有相同的偏移量。这听起来对您来说可能已经足够好了,因为在分析日期/时间时,您需要处理的只是偏移量。

从.NET 3.5开始对时区的支持比以前好多了,但我真的希望看到一个标准的"ZonedDateTime"或类似的东西—一个UTC时间和一个实际时区。构建自己的库很容易,但是在标准库中看到它会很高兴。

编辑:大约四年后,我现在建议使用noda-time,它有一组更丰富的日期/时间类型。不过,作为《野田佳彦时代》的主要作者,我还是有偏见的。


不。

A developer is responsible for keeping track of time-zone information associated with a DateTime value via some external mechanism.

这是一篇优秀文章的引言。必须为每个.NET开发人员读取。

所以我的建议是编写一个适合您需要的小包装类。


有一个.NET的公共域时区库。真的很有用。它可以满足你的需要。

解决一般情况下的时区问题比你想象的要困难。


您可以使用TimeZoneInfo类

时区类识别本地时区,并可以在协调世界时(UTC)和本地时间之间转换时间。TimeZoneInfo对象可以表示任何时区,TimeZoneInfo类的方法可以用于将一个时区中的时间转换为任何其他时区中的相应时间。TimeZoneInfo类的成员支持以下操作:

  • 检索已由操作定义的时区系统。

  • 枚举系统上可用的时区。

  • 转换不同时区之间的时间。

  • 创建尚未由定义的新时区操作系统。

    为以后的检索序列化时区。


  • 从API(http://msdn.microsoft.com/en-us/library/system.datetime-members(vs.71.aspx)来看,它似乎无法显示所用时区的名称。


    通常的做法是将数据作为日期时间传递,其中"时区"为UTC,然后传递TimeZoneInfo对象,当准备好显示数据时,可以使用TimeZoneInfo对象转换UTC日期时间。

    另一个选项是使用当前时区设置日期时间,然后确保"TimeZone"对于日期时间对象未知,然后确保再次使用TimeZoneInfo传递日期时间,该TimeZoneInfo指示传递的日期时间的时区。

    正如其他人在这里所指出的,如果微软能够做到这一点,并创建一个很好的对象来完成这一切,那就太好了,但是现在你必须处理两个对象。