您的位置:首页 > 其它

计算指定年指定周的起止日期

2011-11-21 11:15 141 查看
搞个周计划,数据库设计只有年和周,客户还要看日期。。

木有办法,自己写来不及,网上找了段代码自己改了改。。

废话不多说,上代码。。

// <summary>
/// 获取一年中指定的一周的开始日期和结束日期。开始日期遵循ISO 8601即星期一。
/// </summary>
/// <remarks>Write by vrhero</remarks>
/// <param name="year">年(1 到 9999)</param>
/// <param name="weeks">周(1 到 53)</param>
/// <param name="weekrule">确定首周的规则</param>
/// <returns>成功返回 true,否则为 false。</returns>
public bool GetDaysOfWeeks(int year, int weeks, CalendarWeekRule weekrule)
{
//初始化参数
DateTime first = DateTime.MinValue;
DateTime last = DateTime.MinValue;

//不用解释了吧
if (year < 1 | year > 9999)
return false;

//一年最多53周
if (weeks < 1 | weeks > 53)
return false;

//取当年首日为基准
DateTime firstCurr = new DateTime(year, 1, 1);
//取下一年首日用于计算
DateTime firstNext = new DateTime(year + 1, 1, 1);

//将当年首日星期几转换为数字 星期日特别处理 ISO 8601 标准
int dayOfWeekFirst = (int)firstCurr.DayOfWeek;
if (dayOfWeekFirst == 0) dayOfWeekFirst = 7;

//得到未经验证的周首日
first = firstCurr.AddDays((weeks - 1) * 7 - dayOfWeekFirst + 1);

//周首日是上一年日期的情况
if (first.Year < year)
{
switch (weekrule)
{
case CalendarWeekRule.FirstDay:
first = firstCurr;
break;
case CalendarWeekRule.FirstFullWeek:
//顺延一周
first = first.AddDays(7);
break;
case CalendarWeekRule.FirstFourDayWeek:
//周首日距年首日不足4天则顺延一周
if (firstCurr.Subtract(first).Days > 3)
{
first = first.AddDays(7);
}
break;
default:
break;
}
}

//得到未经验证的周末日
last = first.AddDays(7).AddSeconds(-1);

//周末日是下一年日期的情况
if (last.Year > year)
{
switch (weekrule)
{
case CalendarWeekRule.FirstDay:
last = firstNext.AddSeconds(-1);
break;
case CalendarWeekRule.FirstFullWeek:
//不用处理
break;
case CalendarWeekRule.FirstFourDayWeek:
//周末日距下一年首日不足4天则提前一周
if (firstNext.Subtract(first).Days < 4)
{
first = first.AddDays(-7);
last = last.AddDays(-7);
}
break;
default:
break;
}
}
return true;
}


原文链接:http://hi.baidu.com/corbet/blog/item/1bb2982af3119329d42af1fd.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: