我转换了一个字符串,表示我用来创建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时,它们似乎正确地转换回来。
我觉得我错过了一些明显的东西或忽视了一些简单的东西?
答案 0 :(得分:7)
来自维基百科的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。