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

Ete*_*ner 4 linux date

我知道该命令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
Run Code Online (Sandbox Code Playgroud)

并查看相应的输出。

Dop*_*oti 5

$ 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
Run Code Online (Sandbox Code Playgroud)

  • 问题似乎是找到特定日期前两周的星期一的日期。 (3认同)
  • 不是原始问题的答案,但绝对是我正在寻找的。知道日期命令可以进行这样的数学运算很有用。 (3认同)

Kus*_*nda 5

#!/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
Run Code Online (Sandbox Code Playgroud)

输出:

20190315 --> 20190225
20180217 --> 20180129
20170914 --> 20170828
Run Code Online (Sandbox Code Playgroud)

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

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

20190315 -18 days
20180217 -19 days
20170914 -17 days
Run Code Online (Sandbox Code Playgroud)

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

date -d "$thedate -$(date -d "$thedate" +%u) days -13 days" +%Y%m%d
Run Code Online (Sandbox Code Playgroud)

或者

date -d "$thedate -$(date -d "$thedate" +"-%u days -13 days")" +%Y%m%d
Run Code Online (Sandbox Code Playgroud)


roa*_*ima 5

至少在 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
Run Code Online (Sandbox Code Playgroud)