在群裡遇到一網友的問題:求當天是本月的第幾周?用ahk解決。
首先要確定「第幾周」的含義,有以下幾中:
1-7號算第一周,其它類推;
週日到週六算一周;
周一到週日算一周。
問題的複雜在於,用2、3的標準來算,還要看每月1號到週末的幾天,算不算一周?因為可能不滿7天。
網友的標準是:4天以上算一周,3天以下不算。
歸納如下:
a. 周一開始到週六結束算一周;
b. 月初4天以上為第一周,3天以下為第0周。
比如下圖中,1月的1-5號為第一周;3月,1號為第0周,2-8號為第一周。
翻ahk幫助文件,沒有找到直接解決此問題的命令或函式,但與解決問題有關的幾個內建變數有:
a_yyyy(a_year),四位數表示的當前年份(比如2020);
a_mm(a_mon),2 位數表示的當前月份(01-12) ;
a_dd(a_mday),2 位數表示的當前月份的日期(01-31);
a_wday, 1 位數表示的當前星期經過的天數(1-7) ,1表示星期天;
a_now,yyyymmddhh24miss 格式的當前本地時間。
仔細觀察上圖,分析一下,可以得出:週數=本日所在行數 - 引數1。引數1按照規則b計算,比如1月為0,3月為1。幾個變數分別定義為week_index、x、y。如下圖。
那麼,如何求x和y的值?
再觀察思考,發現關鍵在:每月的1號是星期幾(1-7,7為週日,用w1表示)。
問題轉為求1號是星期幾。
這個問題可以用蔡勒(zeller)公式解決。
蔡勒公式的形式如下:
其中:w:星期;0為星期日
c:年份前兩位;
y:年(後兩位數);某年的1、2月要再減1,比如2023年1月,取20-1=19
d:日;這裡為1
[ ]代表取整,即只要整數部分。
(c是世紀數減一,y是年份後兩位,m是月份,d是日數。1月和2月要按上一年的13月和14月來算,這時c和y均按上一年取值。)
注意y與m的取值。
算出來的w除以7,餘數是幾就是星期幾。如果餘數是0,則為星期日。
以2023年10月1日(100周年國慶)為例,用蔡勒(zeller)公式進行計算,過程如下:
蔡勒(zeller)公式:d=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
=49+[49/4]+[20/4]-2×20+[26× (10+1)/10]+1-1
=49+[12.25]+5-40+[28.6]
=49+12+5-40+28
=54w=mod(54,7)=5
即2023年10月1日(100周年國慶)是星期5。
需要注意的是,w可能為負數或0,0表示為星期日,負數需要取絕對值。
找出結題思路,編寫**如下:
y0 := substr(a_yyyy, 3,2) ;年份後兩位
y :=(a_mm>2) ? y0 : (y0-1) ;1、2月要再減1
c := substr(a_yyyy,1,2) ;年份前兩位
m := (a_mm>2) ? a_mm : (a_mm+12) ;月份,1-2月加12
d := a_dd ;幾號,1號為1
w := y + floor(y/4) + floor(c/4) - 2*c + floor(26*(m+1)/10) ;蔡勒(zeller)公式算星期幾,值可能為負數或0,0為星期日
w0 := mod(w,7) ;取值範圍-6~6
w1 :=(w0=0) ? 7 : (abs(w0)) ;切換為1-7,表示星期一到星期日
;用x表示當日在日曆表中的行數
if (a_dd<=(8-w1))
if( a_dd>=(9-w1) and a_dd<=(15-w1))
if( a_dd>=(16-w1) and a_dd<=(22-w1))
if( a_dd>=(23-w1) and a_dd<=(29-w1))
if( a_dd>=(30-w1) and a_dd<=(36-w1))
if( a_dd>=(37-w1))
y0:=8-w1 ;月曆第一行天數
y := (y0<4) ? 1 : 0 ;第一行天數是否小於4
week_index := x - y ;週數
msgbox ,今天是%a_yyyy%年%a_mm%月%a_dd%日 `r是本月第%week_index%周
獲取當天是當年 當月的第幾周
引用命名空間 using system.globalization 示例 datetime date datetime.now 獲取指定時間是當年的第幾周 gregoriancalendar gc new gregoriancalendar int weekofyear gc.getweekofye...
獲取當天是當年 當月的第幾周
引用命名空間 using system.globalization 示例 datetime date datetime.now 獲取指定時間是當年的第幾周 gregoriancalendar gc new gregoriancalendar int weekofyear gc.getweekofye...
怎麼知道乙個日期是一年中的第幾周?
思路 只要知道 datetime.dayofyear 也既是說這一天是一年裡面的第多少天 出去年初的未滿一周的天數 x 就可以算出 datetime.dayofyear x 7 1既是週數 而年初未滿一周的天數 x可以通過 datetime.dayofweek datetime設定為1月1號 來求得...