提供三個實用的日期時間擴展方法: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) 便於調用。