有没有办法检查它是不是是 UTC 的 DST(夏令时)?

Posted

技术标签:

【中文标题】有没有办法检查它是不是是 UTC 的 DST(夏令时)?【英文标题】:Is there a way to check if it's DST (Daylight Saving Time) with UTC?有没有办法检查它是否是 UTC 的 DST(夏令时)? 【发布时间】:2018-08-29 10:46:22 【问题描述】:

有没有办法检查它是否是 UTC 的 DST(夏令时),不使用转换

我不想使用转换,因为它在 10 月 28 日凌晨 2 点不明确。这个:

using System;

namespace Rextester

    public class Program
    
        public static void PrintSeasonKindTime(DateTime utcDate)
        
            // Convert dt to Romance Standard Time
            TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time");
            DateTime localDate = TimeZoneInfo.ConvertTime(utcDate, tzi);

            Console.WriteLine("Local date: " + localDate.ToString("yyyy.MM.d HH:mm:ss") +  (tzi.IsDaylightSavingTime(localDate) ? " is summer" : " is winter"));
        

        public static void Main(string[] args)
        
            DateTime currentUTCDateTime = new DateTime(2018,10,27,23,59,0, DateTimeKind.Utc);
            double nbMinutes = 1.0;

            PrintSeasonKindTime(currentUTCDateTime);
            PrintSeasonKindTime(currentUTCDateTime.AddMinutes(nbMinutes));
        
    

会显示这个:

Local date: 2018.10.28 01:59:00 is summer
Local date: 2018.10.28 02:00:00 is winter

虽然我希望以下显示:

Local date: 2018.10.28 01:59:00 is summer
Local date: 2018.10.28 02:00:00 is summer

由于时间更改是在指定时区的当地时间 2018.10.28 03:00:00 而不是凌晨 2 点(请参阅此处enter link description here)。

但是,这种行为“模棱两可”是正确的,因为它是 10 月 28 日凌晨 2 点的两次;一次在 00:00 UTC(夏季时间凌晨 2 点)和凌晨 1 点(冬季时间凌晨 2 点)一次。你有什么想法吗?

【问题讨论】:

夏令时特定于国家(即位置,而不是时区)。 UTC 只是世界时。显然,UTC 不包含任何特定于国家/地区的信息。 (此外,由于 DST 是一个国家/地区的一项功能/决定,将 UTC 转换为其他时区并没有真正的帮助) 夏令时本质上是模棱两可的。没有办法让它不模棱两可。 @elgonzo:如果不同的国家有不同的夏令时规则,他们会遵守不同的时区。此外,无论如何,“国家”是错误的粒度单位:一些国家遵守多个时区,其中一些国家遵守 DST,而另一些则没有。美国就是一个例子。 “我不想使用转换,因为它在 10 月 28 日凌晨 2 点不明确。”不是凌晨 2 点 UTC。如果您从 UTC 开始,那就没有歧义了。 【参考方案1】:

不可能从 UTC 获取夏令时,因为它是 UTC - 检查 UTC 描述here

您需要当前时区。有了这些信息,您可以使用TimeZoneInfo.IsDaylightSavingTime 确定当前时区当前是否处于夏令时。

如果您在服务器端(例如 Web)存储数据,则应始终尝试获取用户时区并转换为 UTC。

【讨论】:

夏令时不是时区的特征!它特定于各个国家! 当然是具体的——我的帖子里的什么让你这么想? @dsdel 也许是TimeZoneInfo.IsDaylightSavingTime? @JonSkeet 明白了吗? 天哪,我帮助 Jon Skeet 修复了他的评论 O.O 我能得到一个特殊的徽章吗? ^^【参考方案2】:

只需使用 TimeZoneInfo.IsDaylightSavingTime,传入您的 UTC DateTime 值。这将有效将该 UTC 值转换为给定时区并检查结果是否为夏令时,尽管它是否实际执行该转换或只是检查它是否在夏令时是另一回事。

请注意,这绝不是模棱两可的,因为 UTC 值绝不是模棱两可的。

TimeZoneInfo.IsDaylightSavingTime 在您感兴趣的时区通过 2018-10-28T00:00:00Z 时返回 true

【讨论】:

是的,因为它不是正确的日期。正确的日期时间是 2018-10-28T00:00:00Z @AymenTurki:抱歉,修复了那部分 - 但它仍然返回 true :)(基本上我在您的示例代码中添加了 Console.WriteLine(tzi.IsDaylightSavingTime(utcDate));。) 很好,谢谢,我没有尝试这个我以为我必须传递与这个时区相对应的日期时间。

以上是关于有没有办法检查它是不是是 UTC 的 DST(夏令时)?的主要内容,如果未能解决你的问题,请参考以下文章

UTC 是不是遵守夏令时?

检查夏令时是不是生效

如果日期是进行 DST(夏令时)更改的实际日期,有没有办法在 Python 中推断?

夏令时和 UTC 时间

在指定时区导入日期时间,忽略夏令时

如何在 .NET 中的 DST 时间获取 UTC 偏移量