如何将协调世界时(UTC)转换为澳大利亚东部夏令时间(AEDT)?

7
我们正在从我们的交易伙伴API下载数据。迄今为止,我们一直使用“澳大利亚东部标准时间”进行工作,并且一切正常。
在夏令时开始后,我们的交易伙伴表示他们正在使用“澳大利亚东部夏令时(AEDT)”。
我已经使用以下代码将UTC转换为“澳大利亚东部标准时间”。
DateTime utcTime = DateTime.UtcNow;
TimeZoneInfo objTimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("E. Australia Standard Time");
DateTime TPDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime, objTimeZoneInfo);

当我使用“E. Australia Daylight Time”或“Australian Eastern Daylight Time(AEDT)”时,我遇到了以下错误。
The time zone ID 'E. Australia Daylight Time' was not found on the local computer.
The time zone ID 'Australian Eastern Daylight Time (AEDT)' was not found on the local computer.

我应该向FindSystemTimeZoneById()方法传递哪个时区ID才能正确地转换为澳大利亚东部夏令时(AEDT)?

2
好的,你的第一个有一个拼写错误。Daylingh?当然,我不知道纠正后它是否会更好用。 - ProgrammingLlama
3
不能使用不存在的时区。时区并不指冬季或夏季时间。同一个时区在冬季或夏季都有规则来控制其偏移量。 - Panagiotis Kanavos
1
为什么有这个问题?你使用“澳大利亚东部标准时间”出现错误了吗? - Panagiotis Kanavos
2
@Yash 顺便说一下,如果你真的关心时区问题,可以使用 NodaTime 库和 IANA 时区名称Australia/Melbourne 比 Windows 时区名称更清晰明了。IANA 时区数据库和名称已成为事实上的标准。 - Panagiotis Kanavos
2
请按照以下链接中的被接受的答案进行操作:从PST转换为UTC到AEST的TimeZoneInfo.ConvertTime - Ali Azam
显示剩余7条评论
1个回答

18

您可能希望使用“AUS Eastern Standard Time”(适用于堪培拉,霍巴特,墨尔本和悉尼)。尽管名称中有“Standard”一词,但它考虑了夏令时并在冬季使用UTC+10,在夏季使用UTC+11:

var tz = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time");

TimeZoneInfo.ConvertTimeFromUtc(new DateTime(2018,1,1,0,0,0,DateTimeKind.Utc), tz); 
    // => 01/01/2018 11:00:00
TimeZoneInfo.ConvertTimeFromUtc(new DateTime(2018,7,1,0,0,0,DateTimeKind.Utc), tz); 
    // => 01/07/2018 10:00:00

"E. Australia Standard Time" 是布里斯班所在的时区,该时区不遵循夏令时。

您可以使用 TimeZoneInfo.GetSystemTimeZones() 方法获取可用时区的完整列表,也可以在命令行中运行 tzutil /l 命令。


2
这是一个很好的例子,说明为什么应该使用NodaTime和IANA时区名称! - Panagiotis Kanavos
非常感谢,我想我已经得到了答案。我只有一个问题。 一旦夏令时结束,"AUS Eastern Standard Time"会给我标准时间差异(UTC+10:00)吗? - Yash
正如Panagiotis所说,规则已经内置在TimeZoneInfo中(请检查对象的属性)。 - ProgrammingLlama
2
@Yash 是的。时区包括定义何时调整时钟向前或向后的规则。它将使用适当的标准或夏令时偏移量来转换您所需的日期和时间。 - Phil Ross

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接