使用strtotime()的PHP日期格式问题

时间:2011-03-28 18:43:24

标签: php json date strtotime

我正在使用

$jsdate = date("Y, m, d", strtotime('-1 month', (strtotime($date))));

转换我的约会
2011-03-28
to
2011, 02, 28

问题是这会产生不可预测的结果。例如今天我得到了

2011-03-28
converted to
2011, 02, 28  // OK

 AND

2011-03-29
to
2011, 03, 01 // not OK!

有谁知道这里有什么问题吗?我想知道由于-1 month而计算是否不准确。

有没有办法从1中的m中简单地减去...date("Y, m, d", ...

更多信息:

我的数据需要格式化为JavaScript Date Object,其中1月为0,2月为1,等等。因此,无需专门减去1个月,但实际上从月份整数中减去1 。最后,结果字符串不应该提前1个月,但实际上是相同的日期,使用JS Date Object样式表示。我相信@vprimachenko的答案是一个很好的解决方案。如果我的OP中不清楚,我道歉。

谢谢!

3 个答案:

答案 0 :(得分:1)

你可以使用

$datee = explode('-',$date);
if($datee[1]-- < 0) {
    $datee[1]=12;
    $datee[0]--;
}
$jsdate = implode(', ',$datee);

答案 1 :(得分:0)

strtotime可能以意想不到的方式工作,但它是合乎逻辑的

strtotime('-1 months',strtotime('2011-03-29')  // is 2011-02-29
date('Y-m-d','2011-02-29'); //gets converted to the next real date

这是一种解决方法 http://www.phpreferencebook.com/tips/fixing-strtotime-1-month/

答案 2 :(得分:0)

本身的计算并不准确。没有2/29/2011。如果您将输入更改为3/29/2012,您将看到它返回2012年2月29日,因为2012年是闰年。使用类似7/31/2011的东西也会发生同样的情况。 6月只有30天,所以7月31日减1个月就是7月1日(因为6月31日不存在)。

您可以提取月份,减去1并重新制作日期,但这会导致尝试生成不存在的日期。

如果您确实需要上个月的相应日期,您可能需要对以下内容进行if语句,以使日期回滚到2月的最后一天:

$jsdate = date("Y, m, d", strtotime('-1 month', (strtotime($date))));
if($month == '3') {
   $jsdate = date("Y, m, d", strtotime('-1 day', (strtotime($jsdate))));
}

您还必须考虑2月份没有的三月剩余时间以及闰年,并在30天后的31天内做类似的事情。