请参阅以下代码
$compDate = date('d/m/y',strtotime('-2 weeks'));
echo strtotime($compDate)."-->".strtotime('-2 weeks');
回声输出1398882600-->1388938336
。
为什么时间戳不同?
答案 0 :(得分:2)
这是来自PHP手册:
通过查看各个组件之间的分隔符来消除m / d / y或d-m-y格式的日期:如果分隔符是斜杠(/),则假设为美国m / d / y;而如果分隔符是破折号( - )或点(。),则假定为欧洲d-m-y格式。
所以将d/m/y
更改为d-m-y
或m/d/y
和strtotime将完美无缺。
更新:是的,kingkero是对的。您必须将d/m/y
更改为d-m-y H:i:s
或m/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');