繁体   English   中英

为没有夏令时的国家/地区处理TimeZoneInfo转换

[英]Handling TimeZoneInfo conversion for countries with no daylight savings time

波多黎各和其他几个国家/地区没有夏令时。 我没有使用TimeZoneInfo类指定指定国家/地区是否支持夏令时的方法。

DateTime dt = DateTime.UtcNow;        
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Atlantic Standard Time");
if (tz.IsDaylightSavingTime(dt))
    Console.WriteLine("Daylight Savings");

我唯一能想到的就是允许用户指定时区以及是否针对夏时制进行调整,然后使用TimeZoneInfo.GetUtcOffset而不是更直接的TimeZoneInfo.ConvertTimeFromUtc方法。

    if (tz.IsDaylightSavingTime(dt) && !supportsDaylightSaving)
    {
        var utcOffset = new DateTimeOffset(dt, TimeSpan.Zero).AddHours(-1);
        var dt3 = utcOffset.ToOffset(tz.GetUtcOffset(utcOffset)).DateTime;
        Console.WriteLine(dt3);
    }

还有其他方法可以考虑吗? 以上方法有什么不好的地方吗?

与波多黎各的TimeZoneInfo一起使用的正确ID是"SA Western Standard Time"

它有一个DisplayName"(UTC-04:00) Georgetown, La Paz, Manaus, San Juan" ,不遵循夏令时。 很容易错过,但是显示名称中的“圣胡安”确实指波多黎各圣胡安

实际上,在Windows时区数据中,很少有没有不同时区ID的位置。 有些确实存在,对于这些,您将不得不创建一个固定的偏移区域。 例如,加拿大的Atikokan,该时间是美国东部时间,但未使用DST。

如果您对此感到担忧,则可能应该切换到IANA时区 ,您可以使用Noda Time轻松地做到这一点。

如果您不确定应该选择哪个Windows时区,可以随时将IANA时区与CLDR映射进行比较 实际上,它表明"America/Puerto_Rico""SA Western Standard Time"的可能翻译之一。

实际上,有SupportsDaylightSavingTime属性,该属性指示时区是否使用DST。 例如:

ReadOnlyCollection<TimeZoneInfo> zones = TimeZoneInfo.GetSystemTimeZones();
foreach(TimeZoneInfo zone in zones)
{
   if (! zone.SupportsDaylightSavingTime)
      Console.WriteLine(zone.DisplayName);
}

打印所有没有夏令时的时区。

如果波多黎各没有自己的时区,那么下一个最佳选择是找到匹配的时区(即,相同的偏移量且没有DST)并使用它。 如果不存在这样的区域,只需使用UTC并应用恒定偏移即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM