上个月12月31日的PHP日期时间错误

上个月12月31日的PHP日期时间错误,php,datetime,Php,Datetime,我有这个: $previousMonth = new DateTime('2019-12-31'); $previousMonth->modify('-1 month'); 我的理解是“-1个月”应该修改对象,而不考虑该月的天数,或者 当然,我应该得到或期望得到的是11月底(2019-11-30),但我得到的是12月1日(同月)。 顺便说一句,如果我将日期更改为“2019-12-30”(提前一天),那么将是11月底 如果我最初的假设不正确,那么可靠地计算前一个月的最佳替代方案是什么? 有

我有这个:

$previousMonth = new DateTime('2019-12-31');
$previousMonth->modify('-1 month');
我的理解是“-1个月”应该修改对象,而不考虑该月的天数,或者

当然,我应该得到或期望得到的是11月底(2019-11-30),但我得到的是12月1日(同月)。 顺便说一句,如果我将日期更改为“2019-12-30”(提前一天),那么将是11月底

如果我最初的假设不正确,那么可靠地计算前一个月的最佳替代方案是什么?
有什么想法吗?

要获取上个月的最后一天,您可以获取当月的第一天并减去1秒或1天:

$previousMonth = new DateTime('2019-12-31');
$previousMonth->modify($previousMonth->format('Y-m-01')); // date is 2019-12-01 00:00:00
$previousMonth->modify('-1 sec');
echo $previousMonth->format('Y-m-d H:i:s') . PHP_EOL; // Outputs 2019-11-30 23:59:59

$previousMonth->modify('+1 sec'); // set back the original date 2019-12-01 00:00:00
$previousMonth->modify('-1 day');
echo $previousMonth->format('Y-m-d H:i:s'); // Outputs 2019-11-30 00:00:00

在php中获取最后一个月的最简单和最简单的方法是

$previousMonth = date("Y-n-j", strtotime("last day of previous month"));
与其他线程上建议的相同

由于2011年11月31日不存在,因此打印出2019-12-01

以下内容无法回答您的问题,但在将来可能会有所帮助。我喜欢在处理日期时使用碳。你的问题可以很简单地用这个解决


它有许多功能,使用极其简单,可以与Composer一起安装。

您想如何获得上个月的收入?上个月的最后一天,不管是哪一天<代码>'2019-12-15'-1个月'应该给出
2019-11-30
2019-11-15
?@Cid正确,独立于日期,它应该给我上个月,有什么想法吗?这回答了你的问题吗。这在这里已经解释了很多次了,你没看吗?发生这种情况的原因是,
2019-11-31
不存在,相反,您最终得到的是
2019-12-01
感谢您的快速回复,乍一看,这在逻辑上应该是一个好的解决方案,我将专门针对边缘情况进行测试,然后回复您。只有一件事,我的假设是错误的吗?我的意思是“-1个月”只是指30天,而不是动态的“一个月”?同样,这只适用于上个月的最后一天(或第一天)。
$date = "2019-12-31 00:00:00";
echo date('Y-m-d', strtotime($date . '-1month'));