检查DateTime是否在指定范围内

本文关键字:范围内 DateTime 是否 检查 | 更新日期: 2023-09-27 18:15:17

需要检查DateTime是否在特定范围内。我想我需要计算知道今年夏时制的开始日期和结束日期。

我如何计算"三月第二周星期日"的日期?

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/2011是否在3月的第2周星期日和11月的第1周星期日之间,答案应该是NO

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

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

所以,我将从3月的第一天开始循环,直到第二次到达周日。同样的,我将从11月的第一天开始循环(将天数增加1),直到我第一次到达周日。

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

注:我不能使用TimeZoneInfo,因为它在Silverlight中附注:我不能使用DateTime.IsDaylightSavingsTime,因为我没有时间使用"local"

检查DateTime是否在指定范围内

尝试使用DateTime.IsDaylightSavingsTime方法。

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

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

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

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

这对您来说可能足够了:http://www.codeproject.com/KB/datetime/TimePeriod.aspx

在多个时区操作是一件棘手的事情。一般来说,这个问题不是一个人就能解决的(除非你把一生都奉献给它)。如果你需要支持2-3个时区,那么你可以使用循环解决方案(我知道这是。net中计算周的唯一方法)。

我用这个代码来计算夏令时切换的星期:

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

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