获取上个月,无论天数如何

获取上个月,无论天数如何

在 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 日(除非在闰年执行)。

欲了解更多信息,请参阅以下内容回答

相关内容