我找到了我要知道的确切内容,它是如此简单(或应该如此):

TimeZone.GetDaylightChanges()恰好返回我所需要的:当夏令时开始和结束时:

为此,我想这样做:

TimeZoneInfo currentTimezone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneName);
TimeZone zone = new TimeZone (currentTimezone);  // Compile error here.

DaylightTime changes = zone.GetDaylightChanges();


当然,这不会编译,因为TimeZone的构造函数不采用TimeZoneInfo(Wtf?),而且我不知道如何以其他方式获取DaylightTime更改。我需要有人将“ timeZoneName”设置为任何时区,并能够获取将其设置为任何时区的开始/结束日期时间。

至关重要的是:服务器正在运行(很可能是)UTC,而不是“ timeZoneName”中的时区

最佳答案

不幸的是,您不能像这样实例化新的TimeZone对象。但是,我相信您可以通过浏览AdjustmentRules从TimeZoneInfo类中获取所需的信息。

以下是我为实现所需功能而编写的一些方法。请参阅底部的示例用法,以了解与当前系统时区使用TimeZone方法进行比较的方式。

更新

我将代码修改为两类,以帮助解决日期数学问题,并大量借鉴了以下示例:https://msdn.microsoft.com/en-us/library/system.timezoneinfo.transitiontime.isfixeddaterule.aspx

public static DaylightTime GetDaylightChanges(string timeZoneName, int year)
{
    TimeZoneInfo currentTimezone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneName);

    var currentRules =
        currentTimezone.GetAdjustmentRules().FirstOrDefault(rule =>
            rule.DateStart <= DateTime.Today &&
            rule.DateEnd >= DateTime.Today);

    if (currentRules != null)
    {
        var daylightStart =
            GetTransitionDate(currentRules.DaylightTransitionStart, year);

        var daylightEnd =
            GetTransitionDate(currentRules.DaylightTransitionEnd, year);

        return new DaylightTime(daylightStart, daylightEnd,
            currentRules.DaylightDelta);
    }

    return null;
}

private static DateTime GetTransitionDate(TimeZoneInfo.TransitionTime transition,
    int year)
{
    return (transition.IsFixedDateRule)
        ? new DateTime(year, transition.Month, transition.Day,
            transition.TimeOfDay.Hour, transition.TimeOfDay.Minute,
            transition.TimeOfDay.Second)
        : GetNonFixedTransitionDate(transition, year);
}

private static DateTime GetNonFixedTransitionDate(
    TimeZoneInfo.TransitionTime transition, int year)
{
    var calendar = CultureInfo.CurrentCulture.Calendar;
    int startOfWeek = transition.Week * 7 - 6;
    int firstDayOfWeek = (int) calendar.GetDayOfWeek(new DateTime(year,
        transition.Month, 1));

    int changeDayOfWeek = (int) transition.DayOfWeek;

    int transitionDay = (firstDayOfWeek <= changeDayOfWeek)
        ? startOfWeek + (changeDayOfWeek - firstDayOfWeek)
        : startOfWeek + (7 - firstDayOfWeek + changeDayOfWeek);

    if (transitionDay > calendar.GetDaysInMonth(year, transition.Month))
        transitionDay -= 7;

    return new DateTime(year, transition.Month, transitionDay,
        transition.TimeOfDay.Hour, transition.TimeOfDay.Minute,
        transition.TimeOfDay.Second);
}


与使用当前的TimeZone方法相比,这是如何使用它的示例:

public static void Main()
{
    var daylightTime = GetDaylightChanges("Pacific Standard Time", DateTime.Today.Year);
    var dylightTime2 = TimeZone.CurrentTimeZone.GetDaylightChanges(DateTime.Today.Year);
}

10-06 13:21
查看更多