【问题标题】:How to create a TimeZone object for a specific timezone? c#如何为特定时区创建 TimeZone 对象? C#
【发布时间】:2015-03-19 00:21:14
【问题描述】:

我找到了我所知道的确切的东西,它是如此简单(或应该是):

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

为此,我想做:

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

DaylightTime changes = zone.GetDaylightChanges();

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

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

【问题讨论】:

    标签: c# .net date datetime .net-4.5


    【解决方案1】:

    不幸的是,您不能像这样实例化一个新的 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);
    }
    

    【讨论】:

    • 提出了 238 天的时移,所以我猜这是不对的。但是,基本代码看起来是一个好的开始。
    • 修正后的代码为:return new DaylightTime(daylightStart, daylightEnd, currentRules.DaylightDelta);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    相关资源
    最近更新 更多