我想生成一个 n 周范围日期列表,从当前周开始,就像这样
2014-03-22 2014-03-28
2014-03-15 2014-03-21
2014-03-08 2014-03-14
etc.
其中每行的第一个日期是每周期间的开始,从星期六开始到星期五结束。
我的偏好是在shell脚本中使用awk或其他Unix工具执行此操作。字段分隔符并不重要,但记录应该是每行一个。
答案 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,可能有更好的方法,但我想到的第一件事。