【问题标题】:PHP Strtotime -1month -2monthPHP Strtotime -1 月 -2 月
【发布时间】:2009-07-31 10:31:21
【问题描述】:

昨天运行良好,没有更改代码。

echo date("M", strtotime("-3 month", time()) );
echo date("M", strtotime("-2 month", time()) );
echo date("M", strtotime("-1 month", time()) );
echo date("M", time());

它昨天产生的输出和你预期的一样——即四月、五月、六月、七月

今天它与五月五月七月相呼应

有什么想法吗?

提前致谢。

【问题讨论】:

  • 今天,我们是第31个;可能有一些相关的东西^^

标签: php strtotime


【解决方案1】:

可能与bug#44073有关

你可以试试这样的:

echo date("M", strtotime("-3 month", strtotime(date("F") . "1")) ) . "\n";
echo date("M", strtotime("-2 month", strtotime(date("F") . "1")) ) . "\n";
echo date("M", strtotime("-1 month", strtotime(date("F") . "1")) ) . "\n";
echo date("M", time()) . "\n";

(解决方案在 strtotime 的 cmets 部分找到;direct link

还有输出:

Apr
May
Jun
Jul

日期格式和月份名称之类的“作弊”……

【讨论】:

    【解决方案2】:

    Gorden 正确地发现了这个问题,但我想提供另一个有用的解决方案,而不是技术性的解决方案。只需在您的 strtotime 中使用“第一天”或“最后一天”。例如,以下示例在一个月的 31 日解决了这个问题:

    // Today is May 31st
    //All the following return 2012-04-30
    echo date('Y-m-d', strtotime("last day of -1 month"));
    echo date('Y-m-d', strtotime("last day of last month"));
    echo date_create("last day of -1 month")->format('Y-m-d'); 
    
    // All the following return 2012-04-01
    echo date('Y-m-d', strtotime("first day of -1 month")); 
    echo date('Y-m-d', strtotime("first day of last month"));
    echo date_create("first day of -1 month")->format('Y-m-d');
    

    【讨论】:

    • 也可以在 2 个月后获得最后一天 echo date('Y-m-d', strtotime('last day of +2 month'));
    【解决方案3】:

    试试这个而不是strtotime

    mktime(0, (date("n") - 3 + 12) % 12, 1)
    

    想法是获取当前月份数 (date("n")),从中减去您想要的月份数(此处为 -3),将其加上 12,然后取模 12。

    【讨论】:

      【解决方案4】:

      这是已知和预期的行为。原因是 month 是一个没有固定长度的相对日期。来自http://www.gnu.org/software/tar/manual/html_node/Relative-items-in-date-strings.html#SEC120

      时间位移单位可以通过字符串“年”或“月”来选择,以整年或整月移动。这些是模糊单位,因为年和月的持续时间并不相同。更精确的单位是 'fortnight' 表示 14 天,'week' 表示 7 天,'day' 表示 24 小时,'hour' 表示 60 分钟,'minute' 或 'min' 表示 60 秒,以及 'second' 或'sec' 值一秒钟。接受并忽略这些单位上的“s”后缀。

      因此(强调我的)

      单位中的模糊可能会导致相关项目出现问题。例如,“2003-07-31 -1 月”可能计算为 2003-07-01,因为 2003-06-31 是无效日期。 为了更可靠地确定上个月,您可以要求当月 15 日之前的月份。例如:

      $ date -R
      Thu, 31 Jul 2003 13:02:39 -0700
      $ date --date='-1 month' +'Last month was %B?'
      Last month was July?
      $ date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!'
      Last month was June!
      

      上面可以用PHP表示为

      echo date('M', strtotime(date('Y-m-') . '15 -1 month'));
      

      另见http://bugs.php.net/bug.php?id=22486下方的评论

      【讨论】:

        【解决方案5】:

        从 PHP 5.3(参考:https://bugs.php.net/bug.php?id=44073)及更高版本您可以执行以下操作:

        first day of +1 month”或“first day of next month”甚至“last day of next month

        例子:

        $date = '2015-12-31';
        
        echo date("Y-m-d", strtotime($date ."first day of previous month"));
        

        将产生:2015-11-01 这不会以 +30 天的时间为基础计算天数。

        【讨论】:

          【解决方案6】:

          一个简单的方法就是这样写

          echo date("M", strtotime("今年+3个月"));

          echo date("M", strtotime("本月-3个月"));

          取决于你用它做什么..

          【讨论】:

            猜你喜欢
            • 2023-01-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-12-05
            • 1970-01-01
            相关资源
            最近更新 更多