【问题标题】:How to tell if it's British Summer Time如何判断是不是英国夏令时
【发布时间】:2014-12-17 20:00:10
【问题描述】:

我有以下代码,应该返回 60 的偏移量(以表明目前在英国,我们处于英国夏令时 - 即比格林威治标准时间提前 60 分钟):

var info = TimeZoneInfo.FindSystemTimeZoneById("Greenwich Standard Time");
DateTimeOffset localServerTime = DateTimeOffset.Now;
double off = localServerTime.Offset.TotalMinutes;
return off;

但是,它返回 0。

谁能帮我解决这个问题?

【问题讨论】:

  • 你没有在任何地方使用info。所以你的off 将是当前时区偏移量。
  • @vc74 这个问题具有误导性。 info 变量已初始化,但未使用。返回的偏移量仅基于DateTimeOffset.Now
  • 有趣。这对我来说很好(捷克夏令时)。您确定您的服务器设置正确,时区正确吗?
  • @vc74 UTC == GMT,始终如此。您似乎是在说英国目前处于 GMT(或 UTC)而不是 BST,但我不认为这是正确的,维基百科同意我的观点,即 BST 直到下周末才会结束。
  • BST 直到周日才结束,DateTimeOffset.Now.Offset.TotalMinutes 现在在英国为我返回 60。

标签: c# .net dst datetimeoffset


【解决方案1】:

使用TimeZoneInfo.IsDaylightSavingTime Method (DateTimeOffset) 查看您所在时区当前是否为夏令时。

var info = TimeZoneInfo.FindSystemTimeZoneById("Greenwich Standard Time");
DateTimeOffset localServerTime = DateTimeOffset.Now;
bool isDaylightSaving = info.IsDaylightSavingTime(localServerTime);

还有更多例子here

【讨论】:

  • 使用时区“格林威治标准时间”对我不起作用,因为它显然不支持夏令时。我不得不改用“GMT 标准时间”。
【解决方案2】:

如果您获得 0 并且居住在英国,则您的机器配置不正确。可能的原因是:

  • 机器的时区设置不正确。点击任务栏上的时钟进行更正。
  • 机器未配置为遵守夏令时。点击时钟。
  • TimeZoneInfo 查询夏令时规则的数据库已过期或已损坏。它存储在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones 注册表项中。

在进行根本性更改时要小心,如果配置错误,很可能是为了解决在服务器上运行的关键业务应用程序中的某种缺陷而故意进行的。与首先管理服务器的人交谈。

【讨论】:

    【解决方案3】:

    另一种选择是使用Noda Time

    以下代码适用于 Noda Time 1.4 及更高版本:

    var zone = NodaTime.TimeZones.TzdbDateTimeZoneSource.Default.ForId("Europe/London");
    var zonedClock = NodaTime.SystemClock.Instance.InZone(zone);
    var zonedDateTime = zonedClock.GetCurrentZonedDateTime();
    bool isDST = zonedDateTime.IsDaylightSavingTime();
    Console.WriteLine(isDST);
    
    • zone 是一个 DateTimeZone 对象,代表英国的时区“欧洲/伦敦”
    • zonedClock 是一个 ZonedClock 对象,在这种情况下代表系统时钟和英国的时区
    • zonedDateTime 是一个 ZonedDateTime 对象,表示时区中的当前日期和时间(“基础时钟提供的当前时刻,调整到该对象的时区”)
    • isDST 是一个布尔值,指示当前时刻是否处于 DST 中。在撰写本文时(2018 年 4 月),计算结果为 true

    对于早期版本的 Noda,ZonedClock 不可用,我们可以这样做:

    var zone = NodaTime.TimeZones.TzdbDateTimeZoneSource.Default.ForId("Europe/London");
    var now = Instant.FromDateTimeOffset(DateTimeOffset.Now);
    var zonedDateTime = new ZonedDateTime(now, zone);
    bool isDST = zonedDateTime.IsDaylightSavingTime();
    

    【讨论】:

      【解决方案4】:

      要掌握从一个时区到另一个时区的转换,您需要了解哪些支持(如何?)哪些不支持。

      foreach (var tz in TimeZoneInfo.GetSystemTimeZones())
      {
          Console.WriteLine("TimeZone Offset: {0} Name : {1}, Supports DLS: {2}", tz.BaseUtcOffset,tz.StandardName,tz.SupportsDaylightSavingTime);
      }
      

      这应该会为您提供所有时区的列表,包括有关 DayLightSaving 的信息。 请注意:

      时区偏移:00:00:00 名称:格林威治标准时间,支持 DLS:False

      时区偏移:00:00:00 名称:GMT 标准时间,支持 DLS:True

      因此您需要使用“GMT 标准时间”,因为它已经支持夏令时。不需要做任何工作。

      这里是示例代码:

      private static string GetBSTTimeStamp(string timestamp)
      {
          DateTime dt = DateTime.Parse(timestamp);
          //TimeZoneInfo bst = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
          //Console.WriteLine("Time zone supports dls? {0}", bst.SupportsDaylightSavingTime);
          //Console.WriteLine("Time zone offset? {0}", bst.BaseUtcOffset);
          DateTime dateTimeInUtc = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(dt, "Eastern Standard Time", "GMT Standard Time");
          return dateTimeInUtc.ToString();
      }
      

      【讨论】:

        猜你喜欢
        • 2019-09-29
        • 2014-05-12
        • 2010-10-19
        • 2018-07-06
        • 1970-01-01
        • 1970-01-01
        • 2012-04-24
        • 2020-09-16
        • 1970-01-01
        相关资源
        最近更新 更多