Php 为什么strotime给出不同的值
请参阅下面的代码Php 为什么strotime给出不同的值,php,datetime,Php,Datetime,请参阅下面的代码 $compDate = date('d/m/y',strtotime('-2 weeks')); echo strtotime($compDate)."-->".strtotime('-2 weeks'); 回波输出1398882600-->13889336 为什么时间戳不同 这来自PHP手册: 通过查看各个组件之间的分隔符,可以消除m/d/y或d-m-y格式的日期歧义:如果分隔符是斜杠(/),则假定为美式m/d/y;而如果分隔符是破折号(-)或点(.),则假定为欧洲d
$compDate = date('d/m/y',strtotime('-2 weeks'));
echo strtotime($compDate)."-->".strtotime('-2 weeks');
回波输出1398882600-->13889336
为什么时间戳不同 这来自PHP手册: 通过查看各个组件之间的分隔符,可以消除m/d/y或d-m-y格式的日期歧义:如果分隔符是斜杠(/),则假定为美式m/d/y;而如果分隔符是破折号(-)或点(.),则假定为欧洲d-m-y格式 因此,将
d/m/y
更改为d-m-y
或m/d/y
,将非常有效
更新:是的,是正确的。您必须将
d/m/y
更改为d-m-y H:i:s
或m/d/y H:i:s
。关键是你不能忽略小时、分钟和秒。第一个问题是格式错误-如所述。第二个问题是,当格式化为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
如果不需要时间,只需要日期,也可以在
strotime()
中设置时间
$compDate = date('m/d/y',strtotime('-2 weeks'));
var_dump( strtotime($compDate) === strtotime('-2 weeks, 0:0:0')); // TRUE
strotime
假设x/x/x
符号是美国的,x-x-x
符号是欧洲的。由于您将d/m/Y
作为$compDate
的格式传递,然后将该日期字符串作为第二次通过strotime()
传递,因此第二次将该日期字符串解释为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');
或者这样:
$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
,因此,上面给出了如何在该格式和历元时间戳之间交换的想法。如果您想使用日期时间
获取相对日期(如-2周
),可以将上述内容修改为:
$compDate = new DateTime('-2 weeks');
echo $compDate->format('U') . "-->" . strtotime('-2 weeks');
echo $compDate->format('d/m/Y');
如果希望时间戳是日期的,但不想使用时间,可以将今天
添加到相对格式中,如下所示:
$compDate = new DateTime('2 weeks ago today');
echo $compDate->format('U') . "-->" . strtotime('-2 weeks 00:00');
echo $compDate->format('d/m/Y');
我测试了“d-m-y”,但它不匹配
m/d/y:138860200-->138839310
d-m-y:1105641000-->138839260-->。稍后在代码中调用strotime
时,它将返回不同的值。时间已经过去了。即使在这种情况下,时间戳也不会有多大区别。我可以在一秒钟内按刷新至少3次。:)$compDate=日期('d-m-y',标准时间('-2周');echo strottime($compDate)。"-->" . 标准时间('-2周');未按所述给出o/p