TimeZoneInfo.ConvertTime 从 PST 到 UTC 再到 AEST - 延迟一小时

TimeZoneInfo.ConvertTime from PST to UTC to AEST - off by one hour

我转换了一个代表太平洋时区时间的字符串,我用它来创建一个 DateTime 对象:

var pacificDateTime = new DateTime(2016, 11, 16, 15, 0, 0) // 11/16/2016 3:00:00 PM

使用它,我创建了一个 DateTimeOffset 因为最终它变得更容易使用。

var pacificTimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
var dateTimeNoKind = new DateTime(pacificDateTime.Ticks, DateTimeKind.Unspecified)
var DateTimeOffsetValue = TimeZoneInfo.ConverTimeToUtc(dateTimeNoKind, pacificTimeZoneInfo) // 11/16/2016 11:00:00 PM

到目前为止一切顺利。 UTC 和太平洋时间的区别是 UTC 提前 8 小时(给定的时间在夏令时之内)。

然后我想从 UTC 转换为 AEST——但这就是问题出现的地方:

var australianEasternTimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time");
TimeZoneInfo.ConvertTime(DateTimeOffsetValue, australianEasternTimeZoneInfo) // 11/17/2016 10:00:00 AM

AEST 比 UTC 早 10 小时。我原以为该值为 11/17/2016 09:00:00 AM,但我的结果却多了一个小时。

作为测试,当我从 UTC 时间转换为 PST、GMT 或 EST 时,它们似乎能正确转换回来。

我觉得我遗漏了一些明显的东西或忽略了一些简单的东西?

来自维基百科的 Time in Australia article:

澳大利亚有两个东部时区。在东北,UTC+10 全年适用。在东南部,UTC+10 适用于标准时间,UTC+11 适用于白天时间(又称夏令时)。

东北地区(昆士兰)使用IANA时区标识符"Australia/Brisbane",而东南地区(新南威尔士)使用"Australia/Sydney"。这些 correspond 到 Windows 时区标识符:分别为 "E. Australia Standard Time""AUS Eastern Standard Time"

  • 如果您要转换为昆士兰州,请使用 "E. Australia Standard Time"

  • 如果您要转换为新南威尔士州,请使用 "AUS Eastern Standard Time"

关于这些标识符的混淆性质,请参阅 the timezone tag wiki 中有关 Windows 时区的部分。

如果您想改用标准 IANA 标识符,请使用 Noda Time