当试图获取上个月的最后一天时,PHP出现了奇怪的日期行为


Weird PHP date behavior when trying to get last day of last month

我刚刚注意到PHP日期函数的行为很奇怪,有人能解释我做错了什么吗?

以下代码显示相同的结果

<?php
echo date('Y-m-t');
// Outputs last day of this month: 2016-03-31
echo date('Y-m-t', strtotime("-1 month"));
// For some reason outputs the same: 2016-03-31
echo date('Y-m-t', strtotime("+1 month"));
// Outputs 2016-05-31

这可能只是我的愚蠢,但有人能解释一下为什么会发生这种事吗?

date('Y-m-t')调用中使用t时,您指的是:

t-给定月份的天数

如果你尝试Y-m-d,你会发现它是两个不同的日期:

<?php
var_dump( date('Y-m-d') );
var_dump( date('Y-m-d', strtotime('-1 month') ) );

string(10)"2016-03-31"
string(10)"2016-03-02"

要解决此问题,可以使用strtotime格式last day of last month:

<?php
var_dump( date('Y-m-d') );
var_dump( date('Y-m-d', strtotime('last day of last month') ) );

结果是:

string(10)"2016-03-31"
string(10)"2016-02-29"

试试date('Y-m-d', strtotime("-1 month")),会显示什么?3月2日。为什么?因为2月31日是不存在的,PHP做日期滚动计算。

基本问题是,"减一个月"的定义非常模糊和不明确。当它在"2月31日"这样的日期降落时,应该发生什么?没有好的或正确的答案。不要让PHP来决定结果。如果您期望一个定义的结果,则从一个月的第一个中明确扣除一个月。