如何生成过去几周的连续周范围日期

时间:2014-03-25 16:16:36

标签: bash date awk

我想生成一个 n 周范围日期列表,从当前周开始,就像这样

2014-03-22 2014-03-28
2014-03-15 2014-03-21
2014-03-08 2014-03-14
etc.

其中每行的第一个日期是每周期间的开始,从星期六开始到星期五结束。

我的偏好是在shell脚本中使用awk或其他Unix工具执行此操作。字段分隔符并不重要,但记录应该是每行一个。

3 个答案:

答案 0 :(得分:6)

n=5    
for i in $(seq 0 $((n-1))); do
    echo "$(date -d "last saturday -$i weeks" +"%Y-%m-%d") $(date -d "friday -$i weeks" +"%Y-%m-%d")"; 
done

输出:

2014-03-22 2014-03-28
2014-03-15 2014-03-21
2014-03-08 2014-03-14
2014-03-01 2014-03-07
2014-02-22 2014-02-28

答案 1 :(得分:3)

如果GNU日期有问题,Perl怎么样?这应该只使用标准模块,用于最新版本的Perl

use v5.10;
use Time::Piece;
use Time::Seconds;

$, = " ";

# get the previous saturday, unless today is saturday
my $day = localtime;
$day -= $day->wday * ONE_DAY unless $day->wday == 6;

while (1) {
    say $day->strftime("%F"), ($day + 6*ONE_DAY)->strftime("%F"); 
    $day -= 7 * ONE_DAY;
}

答案 2 :(得分:0)

你可以使用纪元的时间(以秒为单位)来做到这一点。

date +%s

将显示自纪元(1970年1月1日)以来经过的当前秒数。

查看当天和当前日期,减去86400(一天中的秒数)* X到达上周六的天数。

使用' date'中的输出/格式修饰符,以秒为单位打印该数字(我们将其称为' foo')命令,打印(foo + 86400 * 7)为下一个星期五(3月28日)。

然后在前几周打印N周数是一个数学问题(将-86400或7 * -86400应用于自纪元以来经过的更新时间)。

如果您希望使用shell,可能有更好的方法,但我想到的第一件事。