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