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

mch*_*che 1 c# timezone datetime datetimeoffset

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

var pacificDateTime = new DateTime(2016, 11, 16, 15, 0, 0) // 11/16/2016 3:00:00 PM
Run Code Online (Sandbox Code Playgroud)

使用它,我创建了一个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
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.UTC与Pacific之间的区别在于UTC提前8小时(给定时间在夏令时内).

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

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

AEST比UTC早10个小时.我曾预料到价值,11/17/2016 09:00:00 AM但我的结果却增加了一小时.

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

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

Mat*_*int 8

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

澳大利亚时区

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