在 Linux 中,我可以使用以下命令获取上个月的信息
date -d "last month" '+%Y%m'
或者
date -d "1 month ago" '+%Y%m'
但是假设今天是 3 月 31 日,如果我运行顶部的命令,它会显示 201603,但无论我现在在哪一天,我都想获取上个月的信息;我怎样才能这样做呢?
我可以通过使用诸如获取上个月的第一天/最后一天之类的解决方法来实现这一点,但我想知道是否有任何优雅的方法可以做到这一点?
date -d "-$(date +%d) days" '+%Y%m' #get last day of previous month
答案1
通常的做法是使用本月 15 号。然后减去1个月:
$ nowmonth=$(date +%Y-%m)
$ date -d "$nowmonth-15 last month" '+%Y%m'
201602
答案2
GNU date
并不像你想象的那样特别适合算术。这就是我写的原因之一dateutils
。
你的例子可以归结为:
$ dateadd today -1mo -f '%Y%m'
201603
并在 3 月 31 日做了正确的事:
$ dateadd 2016-03-31 -1mo -f '%Y%m'
201602
或者您的评论所暗示的含义(获取上个月的最后一天),无论今天的日期如何:
$ dateround --next today -31d
2016-03-31
$ dateround --next 2016-03-31 -31d
2016-02-29
答案3
我的方法始终是在应用日期算术之前使用已知的可靠日期。在这种情况下,我将获取当月的第一天,然后后退一天
date --date "$(date +%Y-%m-01) -1 day"
在某些时区,如果在月份边界的闰秒(UTC 23:59 之后的第 61 秒)期间运行,这可能会中断。我们在 1999 年 12 月 31 日举行了一次,但我没有查看最近的一次是否也在一个月的范围内。
答案4
几年前我也遇到过同样的问题,关于“1个月前”的真正作用,我得到了一个非常好的答案。
引用@rici的部分答案
- 1 个月将从月份数字中减去 1,然后如果生成的日期无效(例如 2 月 30 日),请对其进行调整以使其有效。因此,12 月 31 - 1 个月是 12 月 1 日,而不是 11 月的一天,3 月 31 - 1 个月是 3 月 3 日(除非在闰年执行)。
欲了解更多信息,请参阅以下内容回答