我知道该命令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)
并查看相应的输出。
$ 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)
#!/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)
至少在 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)
| 归档时间: |
|
| 查看次数: |
9980 次 |
| 最近记录: |