【问题标题】:Weird PHP date behavior when trying to get last day of last month尝试获取上个月的最后一天时奇怪的 PHP 日期行为
【发布时间】:2016-07-19 14:15:03
【问题描述】:

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

可能只是我太笨了,但有人能解释一下为什么会这样吗?

【问题讨论】:

  • 这一切都记录在 GNU 页面上,PHP 文档也清楚地链接到该页面。 Here:The fuzz in units can cause problems with relative items. For example, ‘2003-07-31 -1 month’ might evaluate to 2003-07-01, because 2003-06-31 is an invalid date.

标签: php function date


【解决方案1】:

在您的 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') ) );

字符串(10) "2016-03-31"
字符串(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') ) );

导致:

字符串(10) "2016-03-31"
字符串(10) "2016-02-29"

【讨论】:

  • 感谢您的回复,正如我所想的那样——只是我很愚蠢 :)
  • 如果您想将\DateTime() sub 与\DateInterval('P1M') 一起使用,您可以做什么?结果将与-1 monthlast month 相同。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-10
    • 2021-06-28
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    相关资源
    最近更新 更多