2012-10-09 59 views
2

如何計算下星期一的日期? 例如,如果我有這一天一個變量:BASH:打印下一個星期一的日期

DAYCHECK=2012-10-24 

下一個週一的計算不工作:

date -d $DAYCHECK -dnext-monday +%Y%m%d 

UPDATE:

我已經解決惠普此方法:

numdaycheck=`date -d $DAYCHECK +%u` 
sum=$((8-$numdaycheck)) 
date=`date -d "$DAYCHECK $sum days" +%Y%m%d` 
+0

是的,但不像,這是無解:) – Vincenzo

+2

我想多'-d'選項打破它 - '日期-D「下週一」 +%Y%M%爲D'的作品我... – twalberg

回答

2

如果GNU date(或任何其他date)接受「$ DAYCHECK之後的星期一」的一些變化,我還沒有看到它。我認爲你必須做數學。

$ day_of_week=$(date +%u --date $DAYCHECK) # 1 = Monday, ... 7 = Sunday 
$ date --date "$DAYCHECK +$((8-day_of_week)) days" 

如果DAYCHECK已經是星期一,你會得到以下星期一。如果你想DAYCHECK相反,你需要單獨處理:

$ if ((day_of_week == 1)); then 
> date --date "$DAYCHECK" 
> else 
> date --date "$DAYCHECK +$((8-day_of_week)) days" 
> fi 
0

(回聲命令是沒有必要的。)

kent$ w=$(date -d2012-10-24 +%u) // here get the weekday index 

kent$ echo $w 
3 

kent$ s=$(((7-$w+2)*3600*24+$(date -d2012-10-24 +%s))) //here get the "next monday" seconds 

kent$ echo $s 
1351548000 

kent$ echo $(date +%Y-%m-%d -d "1970-01-01 UTC $s seconds") //finally we get the date of "next monday" 
2012-10-29 

所以「2012-10-29」是最終的答案。

這種方式並不像chepner那麼簡單。我發佈作爲另一個答案,因爲我通常做它的日期計算。例如在給定的日期增加5小時30分鐘。只需更改(7-$w+2)*3600*24部分即可。

希望有一天能幫助別人。

0
next_monday() { 
    local yi=${1:0:4} mi=${1:5:2} di=${1:8:2} 
    mi=${mi#0} 
    di=${di#0} 
    local yo=$yi mo=$mi do 
    do=$(cal -m $mi $yi|awk 'c==1{print$1;exit}NR>2&&/'"$di"'/{c++}') 
    if [ "X$do" = X ];then 
    ((mo=mi+1)) 
    if ((mo>12)); then 
     ((mo=1,yo=yi+1)) 
    fi 
    do=$(cal -m $mo $yo|awk 'NR>2&&!/^ /{print$1;exit}') 
    fi 
    printf "%04d-%02d-%02d\n" $yo $mo $do 
} 
相關問題