关于c#:从PST到UTC到AEST的TimeZoneInfo.ConvertTime – 关闭一小时

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

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

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

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

1
2
3
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与Pacific之间的区别在于UTC提前8小时(给定时间在夏令时内)。

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

1
2
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时,它们似乎正确地转换回来。

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


来自维基百科的澳大利亚时间文章:

Australian Time Zones

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

东北地区(昆士兰州)使用IANA时区标识符"Australia/Brisbane",而东南地区(新南威尔士州)使用"Australia/Sydney"。 它们分别对应于Windows时区标识符:"E. Australia Standard Time""AUS Eastern Standard Time"

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

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

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

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