PHP日期不坚持

时间:2014-12-23 19:53:06

标签: php date

我很难让日期变成变量。当我从当前日期减去几个月时,它会给我0回(默认回到1-1-1970)。

关于我可能做错什么的任何想法?

PHP:

$progress = 5;
$initialDate = date('m-d-Y');
echo "ini date: " . date('m-01-Y',$initialDate) . "<br>";
$date = date('m-01-Y', strtotime("-$progress months", strtotime(date('m-d-Y',$initialDate))));
echo "date: " . $date . "<br>";

输出:

ini date: 12-01-2014
date: 08-01-1969

2 个答案:

答案 0 :(得分:3)

date()的第二个参数必须是内部时间戳格式,即&#34;自Unix Epoch(1970年1月1日00:00:00 GMT)以来的秒数&#34;

strtotime()实际上是将用户输入转换为内部日期格式。如果你想用日期做数学,最好使用更精确的方法。我建议您在此处date_add()阅读:http://php.net/manual/en/datetime.add.php

但是,对代码的最简单修复是:

    $progress = 5;
    $initialDate = time();  // current timestamp, including seconds
    echo "initialDate: $initialDate<br>";
    echo "ini date: " . date('m-01-Y',$initialDate) . "<br>";
    $date = date('m-d-Y', strtotime("-$progress months", strtotime(date('Y-01-d',$initialDate))));
    echo "date: " . $date . "<br>";

请注意,我使用Y-01-d格式作为日期输入的日期,在执行日期数学运算之前返回到月份的第1天,原因有两个:

  • 与m / d / y和d / m / y不同,Y-m-d格式没有被strtotime错误解释的危险。

  • 如果你要从7月30日到2月1日回归5个月,那么将7月1日作为中间步骤更安全,而不是2月28日。&#34;更安全&#34;意思是你甚至需要来测试strtotime是否正确处理2月28日。

答案 1 :(得分:0)

您也可以使用DateTime对象执行此操作。我觉得自己有点可靠。你基本上只是启动一个DateTime对象,然后使用它的:: sub函数减去$ progress月数的DateInterval。

 $progress = 5;
 $initialDate = new DateTime(date("Y-m-01"));
 echo "ini date: ".$initialDate->format("m-01-Y")."<br />";
 $date = $initialDate->sub(new DateInterval("P".$progress."M"));
 echo "date: ".$date->format("m-01-Y")."<br />";

输出:

 ini date: 12-01-2014
 date: 07-01-2014