我正在以字符串的形式获取一个日期/时间值,我正在将其转换为DateTime
对象。
eg. 2012-11-10 11:37:06
我知道这个时间与我的系统本地时间来自不同的时区。
如何为DateTime
对象分配时区,以便能够以本地时区准确表示时间,并对夏令时变化敏感?
DateTime
不是时区,也不完全知道时区。它有一个Kind
,指示它是在系统时区(Local
),UTC(Universal
)还是"其他东西"(Unspecified
)。
有DateTimeOffset
,它就像一个DateTime
,但也与UTC有偏移量。不过,这与拥有时区不同 - 它不知道任何其他时间点的本地时间。
我有偏见,但我建议使用我的Noda Time,它有各种各样的类型来表示不同的概念:
ZonedDateTime
- 特定时区的本地日期/时间,与 UTC 的偏移量仅以防歧义OffsetDateTime
- 与 UTC 有偏移量的本地日期/时间(但没有特定时区)LocalDateTime
- 只是本地日期/时间,没有特定的时区或偏移量LocalDate
- 没有时间部分或区域的日期LocalTime
- 只是一个日期的时间,没有日期或区域
所有这些都有一个关联的日历系统(与DateTime
不同)。在一瞬间,有Instant
只是Unix时代的一些刻度。
如果要坚持使用 BCL 类型,可以在自己的数据类型中保留带有TimeZoneInfo
的DateTime
。
TimeZoneInfo.ConvertTimeToUtc 可能会做你想做的事。
通过这种方式,您可以转换(导入时)并将所有时间存储为 UTC(假设您知道原始时间与哪个时区夏令时偏移量等相关联),并在之后的任何时区显示它们。 我已经链接到重载方法,该方法同时接受DateTime
和TimeZoneInfo
对象。
TimeZoneInfo
还有其他方法对此类转换也很有用。