2013-03-25 58 views
7

我是linux新手。如何在指定的日期範圍內打印和存儲日期。在日期範圍內打印日期linux

例如我有startdate = 2013-03-01和enddate = 2013-03-25;我想打印該範圍內的所有日期。

在此先感謝

回答

2

使用date到您的日期轉換爲秒,做一些數學和轉換回:

#/bin/bash 

dstart=2013-03-01 
dend=2013-03-25 
# convert in seconds sinch the epoch: 
start=$(date -d$dstart +%s) 
end=$(date -d$dend +%s) 
cur=$start 

while [ $cur -le $end ]; do 
    # convert seconds to date: 
    date [email protected]$cur +%Y-%m-%d 
    let cur+=24*60*60 
done 

對日期參數的詳細信息,請參閱man date ..

11

由於只要日期爲YYYY-MM-DD格式,您可以按照字典順序對其進行比較,並且讓date執行日曆算術,而不先將其轉換爲秒:

startdate=2013-03-15 
enddate=2013-04-14 

curr="$startdate" 
while true; do 
    echo "$curr" 
    [ "$curr" \< "$enddate" ] || break 
    curr=$(date +%Y-%m-%d --date "$curr +1 day") 
done 

隨着[ ... ],你需要躲避<以避免與輸入重定向操作混亂。

如果它大於結束日期,則它具有打印開始日期的疣。

+0

所以,只是做了'回聲 「$ CURR」'測試後;) 。 'date --date「$ curr +1 day」'比'let cur = ..好'' – 2013-03-25 20:06:19

+0

可能最好把它放在for循環中而不是while循環中以保證安全。如果您在腳本中參數化startdate和enddate,則循環運行最大366次或1000次。這將防止它無限循環。 – ekangas 2013-09-04 19:56:00

5

,如果你想「最近」日期,另一種是:

echo {100..1} | xargs -I{} -d ' ' date --date={}' days ago' +"%Y-%m-%d" 

顯然不會任意日期範圍工作。

+0

這是我認爲最好的答案接近,我做了一個改變: $ startdate ='2016-03-01';回聲{0..10} | xargs -I {} -d''date --date =「$ startdate +」{}「days」+「%Y-%m-%d」 2016-03-01 2016-03-02 2016- 03-03 .... – user5672998 2018-01-11 18:37:15

0

另一種選擇是使用dateseqdateutilshttp://www.fresse.org/dateutils/#dateseq):

$ dateseq 2013-03-01 2013-03-25 
2013-03-01 
2013-03-02 
2013-03-03 
2013-03-04 
2013-03-05 
2013-03-06 
2013-03-07 
2013-03-08 
2013-03-09 
2013-03-10 
2013-03-11 
2013-03-12 
2013-03-13 
2013-03-14 
2013-03-15 
2013-03-16 
2013-03-17 
2013-03-18 
2013-03-19 
2013-03-20 
2013-03-21 
2013-03-22 
2013-03-23 
2013-03-24 
2013-03-25 
0

略微改進版

#!/bin/bash 
startdate=2013-03-15 
enddate=2013-04-14 

curr="$startdate" 
while true; do 
    [ "$curr" \< "$enddate" ] || { echo "$curr"; break; } 
    echo "$curr" 
    curr=$(date +%Y-%m-%d --date "$curr +1 day") 
done