2013-03-25 201 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