需要检查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
因为我没有时间与善良的“本地”
答案 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框架,因此您可以使用它所拥有的时区功能,只要安装了系统更新,它就应该始终是最新的。