检查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.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框架,你可以使用它的时区功能,只要安装了系统更新,它就应该始终是最新的。