такие данные временного перехода, а не функция, которая вычисляет фактические значения. Чтобы создать такую ​​функцию, я бы где-то нашел данные в сети, а затем создал бы значения, используя статические методы CreateFloatingDateRule или CreateFixedDateRule.

ел бы написать (или использовать, если он уже выходит) функцию в C #, которая возвращает дату / время следующего перехода DST, учитываяSystem.TimeZoneInfo объект и конкретное «как» время в этом часовом поясе. Возвращенное время должно быть в указанном часовом поясе. Функция, которую я хочу, имеет эту подпись:

public DateTime GetNextTransition(DateTime asOfTime, TimeZoneInfo timeZone)
{
    // Implement me!
}

Например, если я передам объект TimeZoneInfo по восточному поясному времени и 1/21/2011 @ 17: 00 в качестве «asOfTime», я ожидаю, что эта функция вернет 3/13/2011 @ 2: 00.

System.TimeZoneInfo.TransitionTime Кажется, в структуре есть вся необходимая информация, но в идеале должен быть какой-то встроенный механизм для преобразования правила в фактическую дату. У кого-нибудь есть предложения?

 Aaron McIver22 янв. 2011 г., 00:09
Летнее время - вполне животное ... имейте в виду, что такие места, как большинство Аризоны (некоторые индейские резервации чтят летнее время), не соблюдают летнее время. Наш часовой пояс остается MST, и поэтому мы не корректируем наше время ... тогда как Денвер перейдет на MDT и отрегулирует их время.
 Azimuth08 нояб. 2016 г., 08:40
Используйте время Нода и посмотритеэта тема о том, как получить время перехода, используя его.

Ответы на вопрос(3)

но я опубликую здесь код, который я использовал для этой цели. Это может сэкономить время для его реализации. Я сделал это на самом деле с помощью ссылки @Jamiegs answer.

    public static DateTime? GetNextTransition(DateTime asOfTime, TimeZoneInfo timeZone)
    {
        TimeZoneInfo.AdjustmentRule[] adjustments = timeZone.GetAdjustmentRules();
        if (adjustments.Length == 0)
        {
            // if no adjustment then no transition date exists
            return null;
        }

        int year = asOfTime.Year;
        TimeZoneInfo.AdjustmentRule adjustment = null;
        foreach (TimeZoneInfo.AdjustmentRule adj in adjustments)
        {
            // Determine if this adjustment rule covers year desired
            if (adj.DateStart.Year <= year && adj.DateEnd.Year >= year)
            {
                adjustment = adj;
                break;
            }
        }

        if (adjustment == null)
        {
            // no adjustment found so no transition date exists in the range
            return null;
        }


        DateTime dtAdjustmentStart = GetAdjustmentDate(adjustment.DaylightTransitionStart, year);
        DateTime dtAdjustmentEnd = GetAdjustmentDate(adjustment.DaylightTransitionEnd, year);


        if (dtAdjustmentStart >= asOfTime)
        {
            // if adjusment start date is greater than asOfTime date then this should be the next transition date
            return dtAdjustmentStart;
        }
        else if (dtAdjustmentEnd >= asOfTime)
        {
            // otherwise adjustment end date should be the next transition date
            return dtAdjustmentEnd;
        }
        else
        {
            // then it should be the next year's DaylightTransitionStart

            year++;
            foreach (TimeZoneInfo.AdjustmentRule adj in adjustments)
            {
                // Determine if this adjustment rule covers year desired
                if (adj.DateStart.Year <= year && adj.DateEnd.Year >= year)
                {
                    adjustment = adj;
                    break;
                }
            }

            dtAdjustmentStart = GetAdjustmentDate(adjustment.DaylightTransitionStart, year);
            return dtAdjustmentStart;
        }
    }


    public static DateTime GetAdjustmentDate(TimeZoneInfo.TransitionTime transitionTime, int year)
    {
        if (transitionTime.IsFixedDateRule)
        {
            return new DateTime(year, transitionTime.Month, transitionTime.Day);
        }
        else
        {
            // For non-fixed date rules, get local calendar
            Calendar cal = CultureInfo.CurrentCulture.Calendar;
            // Get first day of week for transition
            // For example, the 3rd week starts no earlier than the 15th of the month
            int startOfWeek = transitionTime.Week * 7 - 6;
            // What day of the week does the month start on?
            int firstDayOfWeek = (int)cal.GetDayOfWeek(new DateTime(year, transitionTime.Month, 1));
            // Determine how much start date has to be adjusted
            int transitionDay;
            int changeDayOfWeek = (int)transitionTime.DayOfWeek;

            if (firstDayOfWeek <= changeDayOfWeek)
                transitionDay = startOfWeek + (changeDayOfWeek - firstDayOfWeek);
            else
                transitionDay = startOfWeek + (7 - firstDayOfWeek + changeDayOfWeek);

            // Adjust for months with no fifth week
            if (transitionDay > cal.GetDaysInMonth(year, transitionTime.Month))
                transitionDay -= 7;

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

Пример использования будет выглядеть так:

// This should give you DateTime object for date 26 March 2017 
// because this date is first transition date after 1 January 2017 for Central Europe Standard Time zone
DateTime nextTransitionDate = GetNextTransition(new DateTime(2017, 1, 1), TimeZoneInfo.FindSystemTimeZoneById("Central Europe Standard Time"))

Вы можете найти код, с которым я игралВот.

которая можетдержать такие данные временного перехода, а не функция, которая вычисляет фактические значения. Чтобы создать такую ​​функцию, я бы где-то нашел данные в сети, а затем создал бы значения, используя статические методы CreateFloatingDateRule или CreateFixedDateRule.

Решение Вопроса

я думаю, он получит то, что вам нужно.

MSDN - TransitionTime

 Matt Johnson07 нояб. 2016 г., 18:24
@ Азимут - Посмотри наTimeZoneInfo.GetAdjustmentRules, Это довольно легко оттуда. Однако, если вы хотите более простой и надежный способ, используйтеВремя Нода
 Matt Johnson19 сент. 2015 г., 21:48
Обратите внимание, что есть внутренний методTransitionTimeToDateTime это делает это. Вы можете найти этов справочном источнике .NET.
 Azimuth07 нояб. 2016 г., 14:19
@MattJohnson еще нужно построитьTransitionTime себя. Это не решает проблему, опубликованную OT, которую я также ищу для решения ...
 Stuart Lange22 янв. 2011 г., 01:20
Спасибо - я нашел это также вскоре после публикации здесь. Я смог адаптировать код там, чтобы выполнить работу. Я опубликую свой окончательный код в своем вопросе, как только я буду более уверенным в этом. Жаль, что преобразование правила с плавающей датой в фактическую дату не раскрывается платформой.
 Nissim14 июл. 2015 г., 09:34
@StuartLange Я был здесь каждую минуту за последние 4,5 года, ожидая, когда вы опубликуете свой код. все еще работаю над этим?

Ваш ответ на вопрос