【问题标题】:Get Start and end date of daylight savings time by Timezone ID通过时区 ID 获取夏令时的开始和结束日期
【发布时间】:2020-07-30 20:47:06
【问题描述】:

类似于我如何通过 ID(“GMT 标准时间”)获取 DateTime 是否为夏令时。如何开始和结束夏令时?

如果数据集中有夏令时,我需要生成包含夏令时开始和结束的报告。

TimeZone.GetDaylightChanges 当您的服务器位于另一个时区时,如何使用它来获取“GMT 标准时间”夏令时的开始和结束日期?

using System;
                    
public class Program
{
    public static void Main()
    {
                var myDate = new DateTime(2020, 5, 31, 11, 9, 0);
                var myTimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
                bool isDaylightSavingTime = myTimeZoneInfo.IsDaylightSavingTime(myDate);
                Console.WriteLine(isDaylightSavingTime);
                if (isDaylightSavingTime)
                {
                    //Get Daylight saving start and end for the timezone by year
                }
    }
}

提前致谢,

【问题讨论】:

标签: c#


【解决方案1】:

正如Steve 上面评论的那样,这是可行的

using System;
using System.Globalization;

public class Program {
  private enum WeekOfMonth {
    First = 1,
    Second = 2,
    Third = 3,
    Fourth = 4,
    Last = 5,
  }

  public static void Main() {
    var myDate = new DateTime(2020, 3, 29, 11, 9, 0);
    var myTimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
    Console.WriteLine(myTimeZoneInfo.SupportsDaylightSavingTime);
    if (myTimeZoneInfo.SupportsDaylightSavingTime) {
      bool isDaylightSavingTime = myTimeZoneInfo.IsDaylightSavingTime(myDate);
      Console.WriteLine(isDaylightSavingTime);
      if (isDaylightSavingTime) {
        string[] monthNames = CultureInfo.CurrentCulture.DateTimeFormat.MonthNames;
        TimeZoneInfo.AdjustmentRule[] adjustments = myTimeZoneInfo.GetAdjustmentRules();
        if (adjustments.Length == 0) {
          Console.WriteLine("{0} has no adjustment rules", myTimeZoneInfo.StandardName);
        }
        else {
          // Handle time zones with 1 or 2+ adjustments differently
          bool showCount = false;
          int ctr = 0;
          string spacer = "";

          Console.WriteLine("{0} Adjustment rules", myTimeZoneInfo.StandardName);
          if (adjustments.Length > 1) {
            showCount = true;
            spacer = "   ";
          }
          // Iterate adjustment rules
          foreach(TimeZoneInfo.AdjustmentRule adjustment in adjustments) {
            if (showCount) {
              Console.WriteLine("   Adjustment rule #{0}", ctr + 1);
              ctr++;
            }
            // Display general adjustment information
            Console.WriteLine("{0}   Start Date: {1:D}", spacer, adjustment.DateStart);
            Console.WriteLine("{0}   End Date: {1:D}", spacer, adjustment.DateEnd);
            Console.WriteLine("{0}   Time Change: {1}:{2:00} hours", spacer, adjustment.DaylightDelta.Hours, adjustment.DaylightDelta.Minutes);
            // Get transition start information
            TimeZoneInfo.TransitionTime transitionStart = adjustment.DaylightTransitionStart;
            Console.Write("{0}   Annual Start: ", spacer);
            if (transitionStart.IsFixedDateRule) {
              Console.WriteLine("On {0} {1} at {2:t}", monthNames[transitionStart.Month - 1], transitionStart.Day, transitionStart.TimeOfDay);
            }
            else {
              Console.WriteLine("The {0} {1} of {2} at {3:t}", ((WeekOfMonth) transitionStart.Week).ToString(), transitionStart.DayOfWeek.ToString(), monthNames[transitionStart.Month - 1], transitionStart.TimeOfDay);
            }
            // Get transition end information
            TimeZoneInfo.TransitionTime transitionEnd = adjustment.DaylightTransitionEnd;
            Console.Write("{0}   Annual End: ", spacer);
            if (transitionEnd.IsFixedDateRule) {
              Console.WriteLine("On {0} {1} at {2:t}", monthNames[transitionEnd.Month - 1], transitionEnd.Day, transitionEnd.TimeOfDay);
            }
            else {
              Console.WriteLine("The {0} {1} of {2} at {3:t}", ((WeekOfMonth) transitionEnd.Week).ToString(), transitionEnd.DayOfWeek.ToString(), monthNames[transitionEnd.Month - 1], transitionEnd.TimeOfDay);
            }
          }
        }
        Console.WriteLine();
      }
    }
  }
}

输出:

True
True
GMT Standard Time Adjustment rules
   Start Date: Monday, January 1, 0001
   End Date: Friday, December 31, 9999
   Time Change: 1:00 hours
   Annual Start: The Last Sunday of March at 1:00 AM
   Annual End: The Last Sunday of October at 2:00 AM

【讨论】:

    猜你喜欢
    • 2011-03-10
    • 2015-11-23
    • 2014-08-13
    • 2015-05-03
    • 1970-01-01
    • 2020-08-16
    • 2018-02-24
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多