从PST到UTC到AEST的TimeZoneInfo.ConvertTime - 关闭一小时

时间:2016-11-17 00:20:47

标签: c# datetime timezone datetimeoffset

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

DateTime

使用它,我创建了一个var pacificDateTime = new DateTime(2016, 11, 16, 15, 0, 0) // 11/16/2016 3:00:00 PM 因为最终它变得更容易使用。

DateTimeOffset

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

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

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

AEST比UTC早10个小时。我原以为价值为var australianEasternTimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time"); TimeZoneInfo.ConvertTime(DateTimeOffsetValue, australianEasternTimeZoneInfo) // 11/17/2016 10:00:00 AM ,但我的结果却增加了一小时。

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

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

1 个答案:

答案 0 :(得分:7)

来自维基百科的Time in Australia article

Australian Time Zones

澳大利亚有两个东部时区。在东北部,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