首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 日期時間擴展方法:計算周數與周起止日期

     編輯:關於C#

提供三個實用的日期時間擴展方法:DatePart(簡易計算當前周數)、WeekRange(獲取本周起止日期字符串)、GetWeekOfCurrDate(精確計算指定日期屬于當年第幾周,符合 ISO 8601 週曆規則)。

方法一:簡易周數

private int DatePart(DateTime dt)
{
    int weekNow = (int)dt.DayOfWeek; // 0=周日
    int dayDiff = -1 * (weekNow + 1); // 距上周六天數
    int days = DateTime.Now.AddDays(dayDiff).DayOfYear;
    int weeks = days / 7;
    if (days % 7 != 0) weeks++;
    return weeks + 1; // 當前周數
}

方法二:本周範圍

private string WeekRange(DateTime dt)
{
    int weekNow = (int)dt.DayOfWeek;
    int dayDiff = -weekNow; // 本周一
    int dayAdd = 6 - weekNow; // 本周日
    string begin = DateTime.Now.AddDays(dayDiff).ToString("MM月dd日");
    string end = DateTime.Now.AddDays(dayAdd).ToString("MM月dd日");
    return $"{begin} - {end}";
}

方法三:精確周數(推薦)

public int GetWeekOfCurrDate(DateTime dt)
{
    int week = 1;
    int year = dt.Year;
    DateTime firstDay = new DateTime(year, 1, 1);
    DateTime lastDay = new DateTime(year, 12, 31);
    int daysOfYear = lastDay.DayOfYear;
    int weekDay = (int)firstDay.DayOfWeek - 1; // 調整周一為起始
    if (weekDay < 0) weekDay = 6;
    int dayAdd = 6 - weekDay;
    DateTime weekStart = firstDay;
    DateTime weekEnd = weekStart.AddDays(dayAdd);
    week = 2;
    for (int i = dayAdd + 1; i <= daysOfYear; i++)
    {
        weekStart = firstDay.AddDays(i);
        weekEnd = (i + 6 > daysOfYear) ? weekStart.AddDays(daysOfYear - i) : weekStart.AddDays(6);
        if (dt.Month == weekEnd.Month && dt.Day <= weekEnd.Day)
            break;
        week++;
        i += 6;
    }
    return week;
}

使用建議

  • 方法一、二適合快速顯示,邏輯簡單但跨年邊界可能不準。
  • 方法三嚴格按「每周一為第一天、第一周包含當年第一個周四」計算,適合報表、統計等正式業務。
  • 建議封裝為 DateTime 擴展方法:public static int GetWeekOfYear(this DateTime dt) 便於調用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved