【问题标题】:IsDaylightSavingTime is triggered at 1:00 instead of 2:00IsDaylightSavingTime 在 1:00 而不是 2:00 触发
【发布时间】:2018-06-13 05:25:42
【问题描述】:

我只是想确定给定日期是否属于夏令时。 2017 年,11 月 5 日凌晨 2:00 应该是触发因素。

  • 如果我的输入是 2017 年 11 月 5 日 00:00:00,则输出对于 DST 为 true
  • 如果我的输入是 11/5/17 01:00:00,则 DST 的输出为 false

我预计凌晨 1 点是真的,而凌晨 2 点对于 DST 来说是假的

这是我的代码

var dateTime = new DateTime(2017,11,5,0,0,0);
var targetTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");

if (targetTimeZone.IsDaylightSavingTime(dateTime)) {
    Console.WriteLine("Daylight Saving Time");
}

【问题讨论】:

  • 考虑到凌晨 1 点发生了两次。您需要在创建 DateTime 时告诉它是哪一个。
  • 有趣,如何做到这一点?
  • IsAmbiguousTime 会更清楚地帮助您reason,但如果您拥有的只是DateTime 而不是Utc,则无能为力关于它 - 没有人知道Local datetime 值代表哪个时间点。
  • 像这样的东西正是创建 NodaTime 的原因。你可以考虑研究一下。
  • 考虑在您的数据库中使用 UTC 时间,并将其向用户显示的时间更改为本地时间。

标签: c# dst


【解决方案1】:

来自the documentation(在备注部分):

如果dateTime 参数在当前对象的时区中指定了一个不明确的时间,则TimeZoneInfo.IsDaylightSavingTime 方法将dateTime 解释为标准时间,并在其Kind 属性为DateTimeKind.LocalDateTimeKind.Unspecified 时返回false。如果 Kind 属性为DateTimeKind.Utc,此方法将选择正确的模糊时间,并指示是否为夏令时。

然后继续解释IsAmbiguousTime,以及一个很长的示例,展示如何使用它们,与您描述的场景非常匹配。

另请注意,接受 DateTimeOffset 参数的 IsDaylightSavingTime 的重载不存在此问题,因为存在偏移时值不能模棱两可 - 类似于 Kind 为 UTC 时。

【讨论】:

    猜你喜欢
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多