C# 日期处理实战:计算周范围与周数
在实际业务开发中,经常需要按周维度统计数据,比如生成周报或者发放周奖。下面分享一段 C# 代码,实现了根据指定日期自动计算当周的起止时间,并结合自定义基准日计算周数的功能。
核心逻辑说明
这段代码主要包含两个方法:WeekShow 用于生成周标题,WeekNumber 用于计算当前是第几周。
周起止日期计算
在 WeekShow 方法中,我们利用 DateTime.AddDays 配合 DayOfWeek 枚举来定位本周的周一和周日。需要注意的是,C# 默认 DayOfWeek.Sunday 为 0,而国内习惯通常以周一为一周的开始。代码中通过偏移量计算,确保能准确截取到对应范围的日期字符串。
public class WeekDateShow
{
// 生产环境请务必使用配置文件管理连接串,切勿硬编码密码
private const string ConStr = "Data Source=orcl;Persist Security Info=True;User ID=hr;Password=<your_password>;Unicode=True";
public static string WeekShow()
{
// 模拟当前日期,实际使用时请替换为 DateTime.Now
DateTime tNow = Convert.ToDateTime("2009-7-15");
// 计算本周起始日期(假设周一开始)
string tb1 = tNow.AddDays((0 - (int)tNow.DayOfWeek) - 7 + 1).ToShortDateString();
// 计算本周结束日期
string tb2 = tNow.AddDays((6 - (int)tNow.DayOfWeek) - 7 + 1).ToShortDateString();
return tb1 + "―" + tb2 + "第" + (WeekNumber() - 1).ToString() + "期周奖入选名单";
}
private static int WeekNumber()
{
DateTime tNow = Convert.ToDateTime("2009-7-15");
// 设定一个固定的基准日期作为第一周起点
string firstDateText = "2008 年 12 月 28 日";
DateTime firstDay = Convert.ToDateTime(firstDateText);
int theDay = 0;
// 根据基准日期的星期几调整偏移量
if (firstDay.DayOfWeek == DayOfWeek.Sunday || firstDay.DayOfWeek == DayOfWeek.Monday)
{
theDay = 0;
}
else if (firstDay.DayOfWeek == DayOfWeek.Tuesday)
{
theDay = 1;
}
else if (firstDay.DayOfWeek == DayOfWeek.Wednesday)
{
theDay = 2;
}
else if (firstDay.DayOfWeek == DayOfWeek.Thursday)
{
theDay = 3;
}
else if (firstDay.DayOfWeek == DayOfWeek.Friday)
{
theDay = 4;
}
else
{
theDay = 5;
}
int weekNum = (tNow.DayOfYear + theDay) / 7 + 1;
return weekNum;
}
}
注意事项
- 安全提示:原代码中包含数据库连接字符串和密码,发布前务必移除敏感信息或使用环境变量注入。
- 日期基准:
WeekNumber方法依赖硬编码的2008 年 12 月 28 日作为基准点,如果业务规则变更,需同步修改此日期及对应的星期偏移逻辑。 - 类型转换:代码中将
DayOfWeek强转为int进行运算,这是 C# 枚举的常见用法,但要注意不同语言对一周起始日的定义差异。
希望这个小工具能帮到你,如果有更复杂的周历需求,建议引入第三方库如 Noda Time 来处理时区和日历系统。
