尝试获取上个月的最后一天时,奇怪的PHP日期行为

时间:2016-03-31 08:31:34

标签: php function date

我刚刚注意到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

这可能只是我愚蠢,但有人可以解释我为什么会这样吗?

2 个答案:

答案 0 :(得分:11)

t来电中使用date('Y-m-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

答案 1 :(得分:6)

试试date('Y-m-d', strtotime("-1 month")),会显示什么? 3月2日。为什么?因为2月31日不存在,并且PHP会进行日期翻转数学运算。

基本问题是&#34;减去一个月&#34;非常含糊不清。 应该发生什么时候会发生在&#34; 2月31日&#34;?没有好的或正确的答案。不要将它留给PHP来决定结果。如果您期望定义的结果,请从一个月的第一个中明确扣除一个月。