使用 GNU 日期获取特定日期两周前星期一的日期

使用 GNU 日期获取特定日期两周前星期一的日期

我知道该命令date -d 'last-monday - 14 days' +%Y%m%d将从“今天的日期”打印两周前的星期一。我需要一种方法来测试不同日期的情况并查看结果。几乎就像我需要提到日期命令来计算相对日期。

我需要一些东西来测试不同的日期,例如:

date -d 'last-monday - 14 days' %Y%m%d from 20190315

date -d 'last-monday - 14 days' %Y%m%d from 20180217

date -d 'last-monday - 14 days' %Y%m%d from 201700914

并查看相应的输出。

答案1

#!/bin/bash

# Our given dates
dates=(
    20190315
    20180217
    20170914
)

# Loop over the given dates
for thedate in "${dates[@]}"; do
    # Get day of the week as digit (1 is Monday, 7 is Sunday)
    day=$( date -d "$thedate" +%u )
    # The Monday the same week is $(( day - 1 )) days earlier than the given date.
    # The Monday two weeks earlier is 14 days earlier still.

    date -d "$thedate -$(( day - 1 + 14 )) days" +"$thedate --> %Y%m%d"
done

输出:

20190315 --> 20190225
20180217 --> 20180129
20170914 --> 20170828

困难之处在于弄清楚如何为GNU 构建正确的字符串--date来计算最终日期。我选择计算给定日期的星期几,然后使用它来计算一个日期字符串,该字符串将给定日期偏移几天,以便结果日期是两周前的星期一。-ddate

最终用于-d上述脚本中的选项参数的实际字符串(使用脚本中给出的日期)是

20190315 -18 days
20180217 -19 days
20170914 -17 days

将脚本压缩为单个命令,该命令对以下位置的单个日期进行计算$thedate

date -d "$thedate -$(date -d "$thedate" +%u) days -13 days" +%Y%m%d

或者

date -d "$thedate -$(date -d "$thedate" +"-%u days -13 days")" +%Y%m%d

答案2

$ date
Wed Mar 20 15:02:23 MST 2019
$ date -d "last-monday"
Mon Mar 18 00:00:00 MST 2019
$ date -d "last-monday - 1 week"
Mon Mar 11 00:00:00 MST 2019

答案3

至少在 Debian 上有一个faketime软件包

faketime '2019-03-15' date
Fri 15 Mar 00:00:00 GMT 2019

faketime '2019-03-15' date --date 'last monday - 14 days'
Mon 25 Feb 00:00:00 GMT 2019

答案4

我尝试采取“可重用工具”的方法。

我的monday脚本:

#!/bin/bash
date=${1:-now}
shift
dow=`date +%u -d "$date"`
dow0=$[ $dow - 1 ]
date -d "$date -$dow0 days" "$@"

怎么运行的:

  • date -d从第一个命令行参数获取参数,例如“2020-01-01 -2 周”
  • 附加参数传递给最终的日期命令,例如格式化+%F
  • 使用 %u (1..7) 获取星期几; 1 是星期一
  • 减去 1,因为我们想要的范围是 0 到 6。
  • 显示给定日期减去“星期几”偏移量的日期

类似的sunday脚本,结果更简单一些:

#!/bin/bash
date=${1:-now}
shift
dow=`date +%w -d "$date"`
date -d "$date -$dow days" "$@"

用法:

# monday 
Mon Aug 29 02:28:45 PM AEST 2022
# sunday now +%F
2022-08-28
# monday '2022-12-01' +%F
2022-11-28

相关内容