我很难让日期变成变量。当我从当前日期减去几个月时,它会给我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
答案 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