0

可能重复:
PHP date() 和 strtotime() 在 31 日返回错误月份

我有这段代码,它输出一些我认为奇怪的东西。所以,我在这里做错了什么。

<?php 
$sP1 = date('m Y');
$sP2 = date('m Y', strtotime('+01 month'));
$sP3 = date('m Y', strtotime('+02 month'));
$sP4 = date('m Y', strtotime('+03 month'));
echo $sP1.'<br>';
echo $sP2.'<br>';
echo $sP3.'<br>';
echo $sP4.'<br>';
?>

这输出

05 2012
07 2012
07 2012
08 2012

我认为第二个应该是

06 2012

有人知道任何解决方案吗?

4

3 回答 3

2

今天是第 31 号,下个月只有 30 天,所以从今天起 1 个月后是 7/12

assuming that today is May 31 2012

date('m Y') == 05 2012
date('m Y', strtotime('+1 month')) == 07 2012 because june has 30 days
date('m Y', strtotime('+2 month')) == 07 2012
date('m Y', strtotime('+3 month')) == 08 2012
date('m Y', strtotime('+4 month')) == 10 2012

我会取今天的日期并找到该月的第一天,然后添加一个月,如果您正在做一些需要每个月完成的事情

于 2012-05-31T17:30:24.603 回答
2

正如其他人所说,这是因为今天是第 31 个月,+1 个月等于 June-31,它变为 Jul-1。如果您在日期字符串中包含日期,您可以准确地看到这一点。

<?php 
$sP1 = date('m-d-Y');
$sP2 = date('m-d-Y', strtotime('+01 month'));
$sP3 = date('m-d-Y', strtotime('+02 month'));
$sP4 = date('m-d-Y', strtotime('+03 month'));
echo $sP1."\n";
echo $sP2."\n";
echo $sP3."\n";
echo $sP4."\n";
/* Outputs:
    05-31-2012
    07-01-2012
    07-31-2012
    08-31-2012
*/
?>

strtotime 虽然可以将开始日期作为字符串的一部分,但正如 King 建议的那样,从第一个开始计算 +N 个月。所以像May-1-2012 +01 month这样的字符串:

<?php
$sP1 = date('m Y');
$sP2 = date('m Y', strtotime(date('M-1-Y').' +01 month'));
$sP3 = date('m Y', strtotime(date('M-1-Y').' +02 month'));
$sP4 = date('m Y', strtotime(date('M-1-Y').' +03 month'));
echo $sP1."\n";
echo $sP2."\n";
echo $sP3."\n";
echo $sP4."\n";
/* Outputs:
    05 2012
    06 2012
    07 2012
    08 2012
*/
?>

http://codepad.org/auYLHvDI

于 2012-05-31T17:47:01.323 回答
1

它按预期工作。简而言之,因为从 5 月 31 日开始的“一个月”是什么?6月30日?8 月 1 日?

我的建议是,如果您需要连续月份,请计算从当月开始的偏移量,而不是当天。或者使用分解的月、日和年部分手动组成您要查找的日期。

于 2012-05-31T17:33:15.970 回答