這幾天跨年,項目上遇到了一個周數計算的問題。
2016年的元旦是周五開始的,之前系統計算的是屬於15年的第53個周,但是年份已經到了16年了。
公司要求從1月1號周五開始算作16年的第一個周,今天1月4號也就是周一,開始算作16年的第二個周。
第一件事先百度,看看有沒有現成的輪子,但是百度出來的都有問題。然后自己找了個案例修改了下。
網上的解決方案是這樣子的。
//一.找到第一周的最后一天(先獲取1月1日是星期幾,從而得知第一周周末是幾) int firstWeekend=7-Convert.ToInt32(DateTime.Parse(DateTime.Today.Year + "-1-1").DayOfWeek); //二.獲取今天是一年當中的第幾天 int currentDay = DateTime.Today.DayOfYear; //三.(今天 減去 第一周周末)/7 等於 距第一周有多少周 再加上第一周的1 就是今天是今年的第幾周了 // 剛好考慮了惟一的特殊情況就是,今天剛好在第一周內,那么距第一周就是0 再加上第一周的1 最后還是1 return Convert.ToInt32(Math.Ceiling((currentDay - firstWeekend) / 7.0)) + 1;
2016年還沒問題,但是到了2017年1月1號,那天剛好是周日,就開始算錯了。
然后稍微做了修改,之后是這樣。
var dt = new DateTime(2017, 01, 01); //找到今年的第一天是周幾 int firstWeekend = Convert.ToInt32(DateTime.Parse(dt.Year + "-1-1").DayOfWeek); //獲取第一周的差額,如果是周日,則firstWeekend為0,第一周也就是從周天開始的。 int weekDay = firstWeekend == 0 ? 1 : (7 - firstWeekend + 1); //獲取今天是一年當中的第幾天 int currentDay = dt.DayOfYear; //(今天 減去 第一周周末)/7 等於 距第一周有多少周 再加上第一周的1 就是今天是今年的第幾周了 // 剛好考慮了惟一的特殊情況就是,今天剛好在第一周內,那么距第一周就是0 再加上第一周的1 最后還是1 int current_week = Convert.ToInt32(Math.Ceiling((currentDay - weekDay) / 7.0)) + 1;
計算正確。