計算周數的方式 - 現在是今年的第幾周?


有很多地方需要用到“周”這個數字,日常辦公可以使用excel的函數獲取,軟件開發可以使用自帶的函數獲取。其實我們從未關心過,我們獲取到的周是如何計算的,計算的值,真的是正確的嗎?或者說真的是你想要的嗎?

 

前些日子,因為“周”這個數字計算失誤,與客戶其他系統不一致,產生了疑問。那么接下來,我就將近期收集到的資料,描述一下。

 

周的計算,目前有3種方式:

1、每年的1月1日(也就是第1天)所在的周,為第1周。

2、每年的第1個完整周(也就是周一到周天必須在1年內)所在的周,為第1周。

3、ISO8036標准,本年度第1個星期四所在的星期,為第1周。

 

經過測試,發現華為榮耀手機日歷,是按照 第1種方法算的。而小米手機則是按照第2種計算方法。第3種方法,暫時沒找到用處。

 

OK,接下來是正題,如何計算。

方式一、適用於程序開發,C#語言調用微軟的System.Globalization的方法

private static string GetWeekOfYear(DateTime dt)
{
    System.Globalization.GregorianCalendar gc = new System.Globalization.GregorianCalendar();
    int weekOfYear = gc.GetWeekOfYear(dt, System.Globalization.CalendarWeekRule.FirstFullWeek, DayOfWeek.Sunday);

    return weekOfYear.ToString().PadLeft(2, '0'); ;
}

 

重點內容是 “GetWeekOfYear”這個函數。

第1個參數是日期

第2個參數:表示用哪種方式計算。目前有3種:FirstFourDayWeek,FirstDay,FirstFullWeek(對應上述我說的幾種)

第3個參數表示以哪一天作為周的第一天

下面附錄一份計算年的算法(無非就是針對1月份的日期,判斷年份是否減1的操作):

 1 // 針對以第1個完整周為第1周的情況下,計算年份
 2 private static int GetYear(DateTime dt)
 3 {
 4     int y = dt.Year;
 5     int m = dt.Month;
 6     int nWeek = int.Parse(GetWeekOfYear(dt));
 7     if (m == 1 && nWeek > 40)
 8     {
 9         y = y - 1;
10     }
11     return y;
12 }

 

根據國人的計算方式:

 1 但是這種方式同樣也是按中國的日期計算方式,當需要使用sql server 的函數DATEPART
 2 
 3 篩選數據的時候,兩個又矛盾了,下面才是終極解決方案:
 4 
 5 public static int WeekOfYear(DateTime dt, CultureInfo ci)
 6         {
 7             return ci.Calendar.GetWeekOfYear(dt, ci.DateTimeFormat.CalendarWeekRule, ci.DateTimeFormat.FirstDayOfWeek);
 8         }
 9 
10 調用方法:WeekOfYear(DateTime.Now, new CultureInfo("zh-CN"));
View Code

 

方式二、Excel計算(辦公常用)

函數1:WEEKNUM (按照上述第1種計算方法計算周數)

參考:https://www.wps.cn/learning/course/detail/id/171.html

函數2:第2中計算方式,未找到-_-|| 。如果后續知道了,會繼續更新。

函數3:ISOWEEKNUM (按照上述第3種方式計算周數,WPS中不存在,只能按照周一為每周第1天計算)

參考:https://support.microsoft.com/zh-cn/office/isoweeknum-%e5%87%bd%e6%95%b0-1c2d0afe-d25b-4ab1-8894-8d0520e90e0e?ui=zh-cn&rs=zh-cn&ad=cn#top

 

我沒有時間去整理更多語言的使用方法,大家有興趣的可以自行研究一下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM