Проверьте, находится ли DateTime в определенном диапазоне - PullRequest
1 голос
/ 22 ноября 2011

Необходимо проверить, находится ли DateTime в определенном диапазоне. Я думаю, мне нужно рассчитать, зная ГОД, первую и последнюю дату времени летнего времени в этом году.

Как бы я обозначил дату "воскресенье недели 2 марта"?

From 1/1/2007 12:00:00 AM to 12/31/9999 12:00:00 AM
  Begins at 2:00 AM on Sunday of week 2 of March
  Ends at 2:00 AM on Sunday of week 1 of November

Например, мне нужно проверить, находится ли 21.11.2011 между воскресеньем недели 2 в марте и воскресеньем недели 1 ноября - ответ должен быть НЕТ

Если я сдаю 8/8/2011 - ответ должен быть да.

По сути, мне нужно написать функцию, чтобы проверить, относится ли моя дата к летнему времени. Моя единственная идея пока состоит в том, чтобы написать циклы, чтобы найти 2-ю неделю, например.

Итак, я буду повторять петлю с первого дня марта до второго воскресенья. То же самое я бы зациклил (увеличивая число дней на 1) с 1-го дня ноября до первого воскресенья.

Другими словами, мне нужна функция, чтобы проверить, находятся ли входные данные в период летнего времени. Период времени, определенный ограничением выше.

P.S. Я не могу использовать TimeZoneInfo, так как он в Silverlight P.P.S Я не могу использовать DateTime.IsDaylightSavingsTime, так как у меня нет времени с добрым "local"

Ответы [ 5 ]

4 голосов
/ 22 ноября 2011

Попробуйте использовать метод DateTime.IsDaylightSavingsTime.

Если ваше время указано в формате UTC, вы можете преобразовать его в местное и затем использовать IsDaylightSavingsTime():

var localDateTime = utcDateTime.ToLocalTime();
var isDaylightSavings = localDateTime.IsDaylightSavingsTime();
2 голосов
/ 22 ноября 2011

Я только что сделал этот маленький метод, проверь его и дай мне знать:

    bool IsInDaylightSavingsTime(DateTime date)
    {
        // get second sunday in march
        DateTime _tempDateMar = new DateTime(date.Year, 3, 1);
        int secondSunDayInMar = (8 - (int)_tempDateMar.DayOfWeek) + 7;
        _tempDateMar = new DateTime(date.Year, 3, secondSunDayInMar, 2, 0, 0);

        //get first sunday in november
        DateTime _tempDateNov = new DateTime(date.Year, 11, 1);
        int firstSunDayInNov = (8 - (int)_tempDateNov.DayOfWeek);
        _tempDateNov = new DateTime(date.Year, 11, firstSunDayInNov, 2, 0, 0);

        return (date >= _tempDateMar && date <= _tempDateNov);
    }
1 голос
/ 22 ноября 2011

Вы можете написать веб-сервис, который принимает дату и время UTC и идентификатор часового пояса и возвращает необходимую информацию, например, IsDaylightSavings.Поскольку у вас будет доступ к полной среде .net, вы можете использовать функциональность часового пояса, которая всегда должна быть актуальной, если установлены системные обновления.

1 голос
/ 22 ноября 2011

Работать на нескольких часовых поясах довольно сложно.В общем, эта проблема неразрешима усилиями одного человека (если вы не посвятите ей свою жизнь).Если вам требуется поддержка, скажем, 2-3 часовых поясов, тогда все в порядке, чтобы использовать циклическое решение (AFAIK, это единственный способ вычислить неделю в .NET).

Я использовал этот код для вычисления недели летнего времениswitch:

/// <summary>
/// Utility method for GetDaylightChanges. 
/// Searches for date defined by TransitionTime structure.
/// </summary>
/// <param name="year">Year for which create date.</param>
/// <param name="transitionTime">TimeZoneInfo.TransitionTime which to use for date calculation.</param>
/// <returns>Transition time.</returns>
private static DateTime DateTimeByWeek(int year, TimeZoneInfo.TransitionTime transitionTime)
{
    const int DaysInWeek = 7;

    // get year and month
    DateTime switchDate = new DateTime(year, transitionTime.Month, 1);

    // move to switch day of week
    while (switchDate.DayOfWeek != transitionTime.DayOfWeek)
    {
        switchDate = switchDate.AddDays(1);
    }

    // move to week
    switchDate = switchDate.AddDays((transitionTime.Week - 1) * DaysInWeek);

    // add time
    switchDate = switchDate.AddHours(transitionTime.TimeOfDay.Hour);

    // sometimes it gives us next month...
    if (switchDate.Month != transitionTime.Month)
    {
        // ...then use previous (last) week
        return switchDate.AddDays(-DaysInWeek);
    }

    return switchDate;
}

очевидно, вам не нужно время, и вам нужно заменить TransitionTime на некоторые пользовательские параметры.

1 голос
/ 22 ноября 2011

этого может быть достаточно для вас: http://www.codeproject.com/KB/datetime/TimePeriod.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...