使用TimeZoneInfo.ConvertTime()获取本地化日期时间时,结果不正确

时间:2018-10-24 09:21:16

标签: c# datetime timezone

我的任务很简单,TimeZoneInfo.ConvertTime()给出了错误的结果。我只是想在“澳大利亚标准时间”区域中找到当前日期时间:

string timeZone = "Cen. Australia Standard Time";
TimeZoneInfo zoneID = TimeZoneInfo.FindSystemTimeZoneById(timeZone);
DateTime nowAtTimeZone = TimeZoneInfo.ConvertTime(DateTime.UtcNow, zoneID);
// result:           24/10/2018 7:43:29 PM
// actual ACST time: 24/10/2018 6:43:29 PM (this is what I want)
// actual ACDT time: 24/10/2018 7:43:29 PM (this is not what I want)

我从这里获得了实际的ACST时间:https://www.timeanddate.com/time/zones/acst

以及实际ACDT时间从此处开始:https://www.timeanddate.com/time/zones/acdt

请注意,将TimeZoneInfo.ConvertTime()替换为TimeZoneInfo.ConvertTimeFromUtc()会得到相同的结果。

请注意,时区是由客户输入的,这是我所拥有的所有信息。他们没有记录城市。

即使我指定了ACST,来自TimeZoneInfo.ConvertTime()的结果似乎也给了ACDT时间。

问题可能是TimeZoneInfo.ConvertTime()正在将夏令时应用于ACST,而不应这样做?如果是这样,我怎么阻止它呢?

2 个答案:

答案 0 :(得分:1)

澳大利亚的时区非常复杂,因为世界各地都存在很多时区。 Wikipedia's page on this subject是一个很好的概述。

如您所见,有两个主要区域使用澳大利亚中央标准时间。一个使用DST,另一个不使用。

对于Windows中带有TimeZoneInfo类的.NET:

  • 使用"Cen. Australia Standard Time"作为使用夏令时的澳大利亚中南部时区的ID。地点包括阿德莱德和其他地区。

  • 使用"AUS Central Standard Time"作为不使用夏令时的澳大利亚中北部时区的ID。地点包括达尔文和其他地区。

TimeZoneInfo类根据给定的时区在做正确的事情。

就选择正确的时区而言,请使用TimeZoneInfo.GetSystemTimeZones()返回所有可用的时区,并使用IdDisplayName属性创建一个下拉列表。用户只需要从显示名称中进行选择,您只需要在代码中使用ID。

答案 1 :(得分:-1)

您需要致电TimeZoneInfo.ConvertTimeFromUtc(datetime, timezoneInfo)。检查一下

 string timeZone = "Cen. Australia Standard Time";
            TimeZoneInfo zoneID = TimeZoneInfo.FindSystemTimeZoneById(timeZone);            
            DateTime nowAtTimeZone = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, zoneID);