我刚刚注意到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来决定结果。如果您期望一个定义的结果,则从一个月的第一个中明确扣除一个月。