2010-07-12 101 views
18

鑑於日年,我怎樣才能得到年周通過使用Bash?得到從一年中的一週年

+0

雖然你可能會得到一個答案這個在這裏,我想這個問題可能更適合我們的姊妹網站stackoverflow.com。 – Chopper3 2010-07-12 09:51:49

+1

這不僅是一個編程問題,而且看起來像我的功課可疑。順便說一句,對此使用Bash是使用錯誤的工具進行工作的一個很好的例子。 – 2010-07-12 10:04:46

+1

+1不使用Bash進行日期計算 - 現代Linux/UNIX機器默認會提供最新的Python或Perl。使用最好的工具來完成這項工作。 – 2010-07-12 11:07:00

回答

33

使用date命令,可以顯示一年的使用「%V」格式參數的一週:

/bin/date +%V 

你可以告訴date分析和使用格式自定義的日期,而不是目前的一個「-d」 參數:

/bin/date -d "20100215" 

然後,將兩者混合選項,可以應用自定義格式自定義日期:

/bin/date -d "20100215" +%V 
+1

太糟糕了,你的解決方案只適用於GNU版本的日期。 Solaris的日期版本不支持-d開關和%V格式選項。 – basvdlei 2010-07-12 11:05:21

+6

還有'%U'(星期日開始,00-53)或'%W'(星期一開始,00-53)(除了'%V'(ISO,星期一開始,01-53)),取決於星期 - 你使用的號碼系統。 – 2010-07-12 11:09:37

+0

無法支持-d的日期的Solaris版本可以通過替換sunfreeware.com版本的日期來解決。 – conandor 2010-10-14 04:00:30

3

如果您使用GNU date你可以使用相對日期如下:

$ doy=193 
$ date -d "Jan 1 +$((doy -1)) days" +%U 
28 

這會給你一個非常簡單的答案,但不依賴於date

$ echo $((doy/7)) 

這不注意星期幾。

這是本週的編號系統的演示:

$ printf "\nDate\t\tDOW\tDOY\t%%U %%V %%W\n"; \ 
for d in "Jan "{1..4}" 2010" \ 
"Dec "{25..31}" 2010" \ 
"Jan "{1..4}" 2011"; \ 
do printf "%s\t" "$d"; \ 
date -d "$d" +"%a%t%j%t%U %V %W"; \ 
done 

Date   DOW  DOY  %U %V %W 
Jan 1 2010  Fri  001  00 53 00 
Jan 2 2010  Sat  002  00 53 00 
Jan 3 2010  Sun  003  01 53 00 
Jan 4 2010  Mon  004  01 01 01 
Dec 25 2010  Sat  359  51 51 51 
Dec 26 2010  Sun  360  52 51 51 
Dec 27 2010  Mon  361  52 52 52 
Dec 28 2010  Tue  362  52 52 52 
Dec 29 2010  Wed  363  52 52 52 
Dec 30 2010  Thu  364  52 52 52 
Dec 31 2010  Fri  365  52 52 52 
Jan 1 2011  Sat  001  00 52 00 
Jan 2 2011  Sun  002  01 52 00 
Jan 3 2011  Mon  003  01 01 01 
Jan 4 2011  Tue  004  01 01 01