13

我是 linux 新手。如何在给定的日期范围内打印和存储日期。

例如我有 startdate=2013-03-01 和 enddate = 2013-03-25 ;我想打印该范围内的所有日期。

提前致谢

4

7 回答 7

17

只要日期是 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

使用[ ... ],您需要转义<以避免与输入重定向运算符混淆。

如果开始日期大于结束日期,这确实有打印开始日期的缺点。

于 2013-03-25T19:04:32.880 回答
8

另一种选择是使用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
于 2017-04-08T02:39:45.297 回答
8

如果您想要“最近”日期,另一种选择是:

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

显然不适用于任意日期范围。

于 2015-09-22T07:37:36.670 回答
3

用于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 -d@$cur +%Y-%m-%d
    let cur+=24*60*60
done

有关man date日期参数的更多信息,请参阅..

于 2013-03-25T18:08:53.940 回答
0

一行版本:

seq 0 24 | xargs -I {} date  +"%Y-%m-%d" -d '20130301 {}day'

# this version is ok if the dates not cross next month
seq -f'%.f'  20130301 20130325
于 2021-09-07T06:13:53.040 回答
0

一个简单的演示

start_date="20191021"                                                                        
end_date="20191025"                                                                          
dates=()                                                                                     
while [[ "${start_date}" != "${end_date}" ]];do                                              
  formatted_date=$(date -d "${start_date}" +"%Y%m%d")                                        
  dates+=( "${formatted_date}" )                                                                                                                                
  start_date=$(date -d "$start_date +1 day" +"%Y%m%d")                                       
done 
于 2019-10-24T16:01:56.620 回答
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
于 2017-08-18T07:37:58.193 回答