C# 计算本周周一与周日日期及判断是否为本周

阿澈
阿澈
发布时间:2026-10-14 | 6人浏览过
原创

在 C# 开发中,经常需要根据某一天的日期推算出该天所在的周一(起始日)和周日(结束日),或者判断某个日期是否位于当前自然周内。由于 C# 中 System.DayOfWeek 枚举将 Sunday 排在最前(值为 0),直接相减可能产生负数,本方法通过简单的算术修正即可准确计算出周边界。

计算本周起始日期(周一)

要获取指定日期所在周的周一,需要计算该日期与周一之间的天数差。如果传入的是周日,由于枚举排序原因,DayOfWeek.Sunday (0) - DayOfWeek.Monday (1) 结果为 -1,因此需要将其修正为 6(即向前推 6 天到达周一)。

复制代码 代码如下:
/// <summary>
/// 计算本周起始日期(礼拜一的日期)
/// </summary>
/// <param name="someDate">该周中任意一天</param>
/// <returns>返回礼拜一日期,后面的具体时、分、秒和传入值相等</returns>
public static DateTime CalculateFirstDateOfWeek(DateTime someDate)
{
    // 计算当前星期几与周一的差值
    int i = someDate.DayOfWeek - DayOfWeek.Monday;
    
    // 修正周日情况:Sunday(0)-Monday(1)=-1,需加7变为6
    if (i == -1) 
        i = 6;
        
    // 创建时间跨度并减去该天数
    TimeSpan ts = new TimeSpan(i, 0, 0, 0);
    return someDate.Subtract(ts);
}

计算本周结束日期(周日)

计算周日相对简单但需注意逻辑。如果当天就是周日,差值为 0。否则,计算从当前日期到周日还需要多少天。同样利用 TimeSpan 的 Add 方法来增加天数。

复制代码 代码如下:
/// <summary>
/// 计算本周结束日期(礼拜日的日期)
/// </summary>
/// <param name="someDate">该周中任意一天</param>
/// <returns>返回礼拜日日期,后面的具体时、分、秒和传入值相等</returns>
public static DateTime CalculateLastDateOfWeek(DateTime someDate)
{
    int i = someDate.DayOfWeek - DayOfWeek.Sunday;
    
    // 如果不是周日,计算距离下一个周日还有几天
    // 例如 Monday(1) - Sunday(0) = 1,需加 6 天到下周?
    // 注意:这里逻辑是计算到“本周”结束。
    // 若 Monday(1), i=1. 7-i = 6. 正确。
    // 若 Saturday(6), i=6. 7-6=1. 正确。
    if(i != 0) 
        i = 7 - i;
        
    TimeSpan ts = new TimeSpan(i, 0, 0, 0);
    return someDate.Add(ts);
}

判断日期是否为本周

判断一个日期是否属于“当前系统时间所在的本周”,可以通过比较该日期的周一与当前日期的周一。如果两个周一相差的天数小于 7 天且大于等于 0(取绝对值后),则说明它们在同一个周范围内。

复制代码 代码如下:
/// <summary>
/// 判断选择的日期是否是本周(根据系统当前时间决定的‘本周'比较而言)
/// </summary>
public static bool IsThisWeek(DateTime someDate)
{
    // 得到 someDate 对应的周一
    DateTime someMon = CalculateFirstDateOfWeek(someDate);
    
    // 得到本周一(基于当前系统时间)
    DateTime nowMon = CalculateFirstDateOfWeek(DateTime.Now);
    
    TimeSpan ts = someMon - nowMon;
    
    // 取时间跨度的绝对值天数
    if (ts.Days < 0)
        ts = new TimeSpan(-ts.Ticks); // 更安全的取反方式,或直接 -ts.Days
    
    // 如果差值超过7天,则不属于同一周
    if (ts.Days >= 7)
    {
        return false;
    }
    else 
    {
        return true;
    }
}

使用注意事项

  • 时间精度:上述方法保留了原始传入日期对象中的时、分、秒信息。如果只需要日期部分进行比较,建议先调用 .Date 属性或格式化输出。
  • 时区问题:DateTime.Now 依赖于操作系统的本地时区设置。在跨时区应用或服务器部署中,请确保服务器时区设置正确,或使用 DateTime.UtcNow 配合 UTC 基准进行周计算,以避免因时区差异导致的“今日”定义偏差。
以上就是 C# 由当前日期计算相应的周一和周日的详细内容,更多关于 C# 日期处理技巧的资料请关注本站其它相关文章!
相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表