我的任务很简单,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,而不应这样做?如果是这样,我怎么阻止它呢?
答案 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()
返回所有可用的时区,并使用Id
和DisplayName
属性创建一个下拉列表。用户只需要从显示名称中进行选择,您只需要在代码中使用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);