首页 文章

从DateTime获取时区

提问于
浏览
87

.Net DateTime是否包含有关创建它的时区的信息?

我有一个库,从最后有“zz”的格式解析DateTime,当它正确解析并调整本地时间时,我需要从DateTime对象获取特定时区 .

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

6 回答

  • 2

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

    DateTimeOffset稍好一些 - 基本上是UTC时间和偏移量 . 然而,这仍然不足以确定时区,因为许多不同的时区在任何一个时间点都可以具有相同的偏移 . 这听起来对你来说可能已经足够了,因为在解析日期/时间时你需要处理的是偏移量 .

    从.NET 3.5开始支持时区要好得多,但我真的很想看到标准的“ZonedDateTime”或类似的东西 - UTC时间和实际时区 . 构建自己的很容易,但在标准库中看到它会很好 .

    编辑:将近四年后,我现在建议使用Noda Time,它有更丰富的日期/时间类型 . 我有点偏见,作为Noda Time的主要作者:)

  • 0

    没有 .

    开发人员负责通过某种外部机制跟踪与DateTime值相关的时区信息 .

    引用优秀文章here . 每个.Net开发人员都必须阅读 .

    所以我的建议是编写一个适合您需求的包装类 .

  • 122

    有一个public domain TimeZone library for .NET . 真有用 . 它将满足您的需求 .

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

  • 5

    你可以使用 TimeZoneInfo

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

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

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

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

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

    序列化时区以便以后检索 .

  • 33

    从API(http://msdn.microsoft.com/en-us/library/system.datetime_members(VS.71).aspx)开始,它似乎不能显示所用时区的名称 .

  • 1

    通常,这种做法是将数据作为带有“时区”UTC的DateTime传递,然后传递TimeZoneInfo对象,当您准备好显示数据时,可以使用TimeZoneInfo对象转换UTC DateTime .

    另一个选项是使用当前时区设置DateTime,然后确保DateTime对象的“timezone”未知,然后确保再次使用TimeZoneInfo传递DateTime,该TimeZoneInfo指示传递的DateTime的TimeZone .

    正如其他人在这里指出的那样,如果微软掌握了这一点并创建了一个很好的对象来完成所有工作,那将是很好的,但是现在你必须处理两个对象 .

相关问题