如何用UTC检查是否为夏令时(DST)?

3

有没有一种方法可以在不使用转换的情况下检查UTC是否为夏令时(Daylight Saving Time)?

我不想使用转换,因为在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点(请参见此处 链接说明)。

然而,这种行为是“含糊不清”的,因为在10月28日的两次2点之间存在时间差;一次在UTC 00:00(夏令时2点),一次在1点(冬令时2点)。你有什么想法吗?


DST是特定于国家(即位置,而不是时区)的。UTC只是普遍时间。显然,UTC不包含任何特定于国家的信息。(另外,由于DST是一个国家的特征/决策,将UTC转换为其他时区并不能真正帮助解决问题) - user2819245
DST本质上是模棱两可的。没有办法使其不具有歧义性。 - Heretic Monkey
1
如果不同的国家有不同的夏令时规则,它们将遵循不同的时区。此外,“国家”本身就是错误的粒度单位:一些国家观察多个时区,其中一些观察夏令时,而另一些则不观察。美国就是一个例子。 - Jon Skeet
3
“我不想使用转换,因为在10月28日凌晨2点时这个时间会有歧义。” 不是在UTC时间的凌晨2点。如果你一开始就使用了UTC时间,则没有歧义。 - Jon Skeet
2个回答

5
只需使用TimeZoneInfo.IsDaylightSavingTime,并传入您的UTC DateTime值。这将有效地将UTC值转换为给定的时区,并检查结果是否处于夏令时,不过它实际上是执行该转换还是只是检查是否会进入夏令时是不同的问题。
请注意,这永远不会有歧义,因为UTC值从不有歧义。
当在您感兴趣的时区中传递2018-10-28T00:00:00Z时,TimeZoneInfo.IsDaylightSavingTime返回true

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

2
无法从UTC获取夏令时,因为它是UTC时间-请检查这里的UTC描述。
您需要当前时区。使用此信息,您可以使用TimeZoneInfo.IsDaylightSavingTime来确定当前时区是否处于DST状态。
如果您正在存储数据服务器端(例如Web),则应始终尝试获取用户的时区并转换为UTC。

当然它是具体的 - 我的帖子里面的哪些内容让你这么想? - dsdel
@dsdel 或许可以使用 TimeZoneInfo.IsDaylightSavingTime - Rafalon
1
@JonSkeet 解了吗? - Rafalon
1
哦天啊,我帮助Jon Skeet修复了他的评论,我能得到一个特别徽章吗?^^ - Rafalon
@JonSkeet,我明白了。那不是我误解的原因。我把时区和时间等同起来了,这是不正确的。虽然时区有一个相关的标准时间(我猜),但国家/州/地区可以决定选择与标准时间不同的时间(例如夏令时)。 - user2819245
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接