代码之家  ›  专栏  ›  技术社区  ›  mulllhausen

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

  •  0
  • mulllhausen  · 技术社区  · 7 年前

    TimeZoneInfo.ConvertTime() 给出的结果不正确。我只想在“Cen”中找到当前的datetime。澳大利亚标准时区:

    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() 给出相同的结果。

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

    结果来自 似乎在给ACDT时间,尽管我已经指定了ACST。

    TimeZoneInfo.ConvertTime() 在ACST上应用夏时制,而不应该是这样吗?如果是这样的话,我怎样才能阻止它这样做呢?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Matt Johnson-Pint    7 年前

    澳大利亚的时区和世界上许多地方一样复杂。 Wikipedia's page on this subject 是一个很好的概述。

    对于Windows上的.NET TimeZoneInfo 班级:

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

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

    这个 时区信息 基于给定的时区,类正在做正确的事情。

    TimeZoneInfo.GetSystemTimeZones() 要返回所有可用时区,请使用 Id DisplayName 属性创建下拉列表。用户应该只需要从显示名称中进行选择,而您只需要在代码中使用ID。

        2
  •  -1
  •   Mahesh Bakali    7 年前

    你需要打电话 TimeZoneInfo.ConvertTimeFromUtc(datetime, timezoneInfo) . 看看这个

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