为什么strtotime给出不同的值

时间:2014-01-19 16:13:43

标签: php datetime

请参阅以下代码

$compDate = date('d/m/y',strtotime('-2 weeks'));
echo strtotime($compDate)."-->".strtotime('-2 weeks');

回声输出1398882600-->1388938336

为什么时间戳不同?

3 个答案:

答案 0 :(得分:2)

这是来自PHP手册:

  

通过查看各个组件之间的分隔符来消除m / d / y或d-m-y格式的日期:如果分隔符是斜杠(/),则假设为美国m / d / y;而如果分隔符是破折号( - )或点(。),则假定为欧洲d-m-y格式。

所以将d/m/y更改为d-m-ym/d/ystrtotime将完美无缺。

更新:是的,kingkero是对的。您必须将d/m/y更改为d-m-y H:i:sm/d/y H:i:s。关键是你不能忽视小时,分钟和秒钟。

答案 1 :(得分:0)

第一个问题是错误的格式 - 如Sharanya Dutta所述。第二个问题是,在格式化为m/d/y而不是m/d/y, H:i:s时,您正在失去精确度,例如

$compDate = date('m/d/y',strtotime('-2 weeks'));

print date("d.m.Y @ H:i:s", strtotime($compDate)); //05.01.2014 @ 00:00:00
print date("d.m.Y @ H:i:s", strtotime('-2 weeks')); //05.01.2014 @ 17:23:42

当您向$compDate添加小时,分钟和秒时,它将按预期工作

$compDate = date('m/d/y, H:i:s',strtotime('-2 weeks'));
var_dump( strtotime($compDate) === strtotime('-2 weeks')); // TRUE

如果您不需要时间而只需要日期,您也可以在strtotime()中设置时间。

$compDate = date('m/d/y',strtotime('-2 weeks'));
var_dump( strtotime($compDate) === strtotime('-2 weeks, 0:0:0')); // TRUE

答案 2 :(得分:0)

strtotime假设x/x/x符号为美国,x-x-x符号为欧洲。由于您将d/m/Y作为$compDate的格式传递,然后将该日期字符串作为第二次传递给strtotime(),因此它第二次将日期字符串解释为m/d/Y 。您可以通过更改代码来确认:

$compDate = strtotime('-2 weeks');
echo $compDate . "-->" . strtotime('-2 weeks');

或者这样:

$compDate = date('d-m-y',strtotime('-2 weeks'));
echo strtotime($compDate) . "-->" . strtotime('-2 weeks');

或者这样:

$compDate = date('m/d/y',strtotime('-2 weeks'));
echo strtotime($compDate) . "-->" . strtotime('-2 weeks');

更好的解决方案是使用DateTime类,它允许您使用createFromFormat定义给定字符串的日期格式,以便解析器知道哪个数字是:

$compDate = date('d/m/y',strtotime('-2 weeks'));
$compDateObject = DateTime::createFromFormat('d/m/y', $compDate);
echo $compDateObject->format('U') . "-->" . strtotime('-2 weeks');

最后一个例子有点复杂,因为通常使用像-2 weeks之类的相对字符串你也不需要担心格式化,但我猜你真正遇到的问题是日期整个代码中使用的格式都在d/m/y中,因此上面介绍了如何在格式和时间戳之间进行切换。如果您想使用DateTime来获取相对日期(例如-2 weeks),则可以将上述内容改为:

$compDate = new DateTime('-2 weeks');
echo $compDate->format('U') . "-->" . strtotime('-2 weeks');
echo $compDate->format('d/m/Y');

如果您希望时间戳为日期但不想使用时间,则可以将today添加到相对格式中,如下所示:

$compDate = new DateTime('2 weeks ago today');
echo $compDate->format('U') . "-->" . strtotime('-2 weeks 00:00');
echo $compDate->format('d/m/Y');