检查特定范围内的DateTime

时间:2011-11-22 01:19:21

标签: c# .net silverlight datetime

需要检查DateTime是否在特定范围内。 我想我需要计算今年DST时间的第一个和最后一个日期。

我怎么算“3月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

例如,我需要检查11月21日是在3月的第2周的星期日和11月的第1周的星期日之间 - 答案应该是否

如果我通过8/8/2011 - 答案应该是肯定的。

基本上,我需要编写函数来检查我的日期是否属于夏令时。到目前为止,我唯一的想法是编写循环来查找第二周。

所以,我会从三月的第一天开始循环,直到第二次星期天。同样的事情我会从11月1日开始循环(增加1天),直到我第一次到达星期天。

换句话说,我需要函数来检查输入数据是否在夏令时期间。由上述约束定义的时间段。

P.S。我不能使用TimeZoneInfo,因为它在Silverlight中 P.P.S我不能使用DateTime.IsDaylightSavingsTime因为我没有时间与善良的“本地”

5 个答案:

答案 0 :(得分:4)

尝试使用DateTime.IsDaylightSavingsTime方法。

如果您的日期时间是UTC,则可以转换为本地,然后使用IsDaylightSavingsTime()

var localDateTime = utcDateTime.ToLocalTime();
var isDaylightSavings = localDateTime.IsDaylightSavingsTime();

答案 1 :(得分:2)

我刚刚做了这个小方法,检查一下,让我知道:

    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);
    }

答案 2 :(得分:1)

答案 3 :(得分:1)

在多个时区上运行是一件棘手的事情。一般来说,这个问题是单个人努力无法解决的(除非你将自己的生命献给它)。如果您需要支持2-3个时区,那么可以使用循环解决方案(AFAIK这是计算.NET周的唯一方法)。

我用这段代码来计算DST开关周:

/// <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

答案 4 :(得分:1)

您可以编写一个带有utc日期时间和时区ID的Web服务,并返回您需要的信息 - 例如IsDaylightSavings。由于您可以访问完整的.net框架,因此您可以使用它所拥有的时区功能,只要安装了系统更新,它就应该始终是最新的。