3

简而言之,我想要这样的东西:

  1. 当我输入一个日期2012-12-27并希望按周扩展日期(从星期一开始)时,它输出:2012-12-24,2012-12-25,2012-12-26,2012-12-27,2012-12-28,2012-12-29,2012-12-30
  2. 当我输入一个日期2012-12-27并希望按月扩展日期时,它会输出:2012-12-01,2012-12-02 ... 2012-12-31

或者,如何按周对一组日期进行分组?例如,当我输入2012-12-01,2012-12-02 ... 2012-12-31. 它输出:2012-12-01,2012-12-02|2012-12-03 ... 2012-12-09|2012-12-10 ... 2012-12-16|...|2012-12-31

我不知道如何完成这个,任何线索可能会有所帮助!

4

2 回答 2

2
DAYSECS=86400                          # seconds in a day
WEEKSECS=604800

echo "Expand on week:"

g_epoch=$(date +"%s" -d $1)            # given date as seconds from epoch
g_dayno=$(date +"%u" -d $1)            # given date as day of week
g_month=$(date +"%m" -d $1)            # given month
g_year=$(date +"%Y" -d $1)             # given year

s_epoch=$(($g_epoch - $DAYSECS * ($g_dayno - 1)))
e_epoch=$(($s_epoch + $WEEKSECS))
for etime in $(seq $s_epoch $DAYSECS $e_epoch); do
  date +"%Y-%m-%d" -d "@$etime"
done

echo "Expand on month:"

s_epoch=$(date +"%s" -d "$g_year-$g_month-01")
e_epoch=$(($s_epoch + 4 * $WEEKSECS))
for etime in $(seq $s_epoch $DAYSECS $e_epoch); do
  if [ $(date +"%m" -d "@$etime") -ne "$g_month" ]; then
    break;
  fi  
  date +"%Y-%m-%d" -d "@$etime"
done
于 2012-12-27T04:27:13.693 回答
0

下面的脚本来自@perreal,我把它留在这里是因为:

  1. 它显示了 GNU date 的强大功能。
  2. 它使@perreal 的想法更加清晰和普遍。

谢谢你,佩雷亚尔!这里是

dd="2012-12-27"  # test date
DAYSECS=86400    # seconds in a day

echo "expand by week:"
s_epoch=$(date +%s -d "$dd -$(($(date +%u -d $dd) - 1)) day")                  # start date of the week
e_epoch=$(date +%s -d "1970-01-01 00:00:00 +0000 +${s_epoch} seconds +6 days")   # end date of the week
for etime in $(seq $s_epoch $DAYSECS $e_epoch); do
  date +"%Y-%m-%d" -d "@$etime";
done

echo "expand by month:"
s_epoch=$(date +%s -d "$dd -$(($(date +%d -d $dd) - 1)) day")                           # start date of the month
e_epoch=$(date +%s -d "1970-01-01 00:00:00 +0000 +${s_epoch} seconds +1 month -1 day")  # end date of the month
for etime in $(seq $s_epoch $DAYSECS $e_epoch); do
  date +"%Y-%m-%d" -d "@$etime";
done
于 2012-12-27T06:29:13.347 回答