date 命令中的“1 个月前”选项如何工作?

tac*_*omi 29 coreutils date

我不确定这是否会在当天获得过去的日期,或者是否只需要 30 或 31 天。

例如

如果当前日期是March 28th,则必须是 1 个月前February 28th,但是当它是 时会发生什么March 30th

设想

我想每天备份一些文件,脚本将在当前日期内保存这些文件,$(date +%Y%m%d)格式20150603_bckp.tar.gz为我的条件:

past_month = $(date -d "-1 month" +%Y%m%d)
day = $(date +%d)
if [ "$day" != 01 ] && [ "$day" != 15 ]
then
    rm /path/of/files/${past_month}_bckp.tar.gz
    echo "Depuration done"
else
    echo "Keep file"
fi
Run Code Online (Sandbox Code Playgroud)

但是我想知道,当日期是 30 日、31 日甚至过去的二月示例时会发生什么?它会保留那些文件吗?或删除第一天的文件?

当它是 31 日时,净化将执行,所以如果过去一个月只有 30 天,这将删除第 1 天的文件?

我希望我有所暗示。

ric*_*ici 30

- 1 month将从月份数中减去一,然后如果结果日期无效(February 30例如),则调整它以使其有效。那么December 31 - 1 monthDecember 1,没有一天11月和March 31 - 1 monthMarch 3(除非闰年执行)。

这是Gnu信息页面的引用date(这是date实现此语法的版本),其中包含一个使算术更健壮的好建议:

单位中的模糊可能会导致相关项目出现问题。例如,2003-07-31 -1 month可能计算为 2003-07-01,因为 2003-06-31 是无效日期。为了更可靠地确定上个月,您可以要求在当月 15 号之前的月份。例如:

    $ date -R
    Thu, 31 Jul 2003 13:02:39 -0700
    $ date --date='-1 month' +'Last month was %B?'
    Last month was July?
    $ date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!'
    Last month was June!
Run Code Online (Sandbox Code Playgroud)

另一个警告,也引用自信息页面:

此外,在处理时钟变化(例如夏令时跳跃)的日期时要小心。在少数情况下,它们会从时钟中增加或减少多达 24 小时,因此 在开始日历计算之前通过将TZ环境变量设置为 来采用世界时通常是明智的UTC0

  • 哦!事实上,任何一个月的某些特定日期的“一个月前”可能会导致 ** 相同的** 月份,这与我对 `date` 实现的期望不同;在我的书中,这在语义上是违反直觉的。- 感谢您指出这一点,很高兴知道。 (2认同)