“上个月的第一天”的结果不同

时间:2014-05-05 15:09:17

标签: php date

为什么我得到了不同的结果

var_dump(strtotime(date('d.m.Y',strtotime("first day of previous month"))));

var_dump(strtotime("first day of previous month"));

结果是:     int(1396303200)和     INT(1396364471)

3 个答案:

答案 0 :(得分:2)

使用日期('d.m.Y')将切断小时,分钟和秒。因此,返回午夜的时间戳。

如果您使用strtotime而不通过日期过滤它,它会根据当前时间返回小时,分钟和秒。在这里,你在午夜17小时后运行了脚本。

echo date('d.m.Y',strtotime("first day of previous month"));// 1.4.2014
echo date('d.m.Y H:i:s',strtotime("first day of previous month"));// 1.4.2014 17:26
echo date('d.m.Y H:i:s',strtotime("1.4.2014"));// 1.4.2014 00:00:00

答案 1 :(得分:2)

这与strtotime()解释日期字符串的方式有关。

来自documentation for strtotime()

  

通过查看各个组件之间的分隔符来消除m / d / y或d-m-y格式的日期:如果分隔符是斜杠(/),则假设为美国m / d / y;而如果分隔符是破折号( - )或点(。),则假定为欧洲dmy格式。为避免潜在的歧义,最好使用ISO 8601(YYYY- MM-DD)尽可能使用date或DateTime :: createFromFormat()。

让我们看一下时间戳值对应的内容:

echo date('r', 1396303200) . "\n";
echo date('r', 1396364471);

输出:

Tue, 01 Apr 2014 03:30:00 +0530
Tue, 01 Apr 2014 20:31:11 +0530

请参阅以下var_dump()语句的输出:

var_dump(date('d.m.Y',strtotime("first day of previous month")));

输出:

string(10) "01.04.2014"

此处分隔符是一个点,因此strtotime()将解释DD-MM-YYYY格式的日期。

为避免这种歧义,请始终使用DateTime::createFromFormat()

答案 2 :(得分:1)

作为strtotime的date()格式将根据具体情况对其进行解释。坚持YYYY-MM-DD等标准格式,您将获得预期的结果。

在您的情况下,您使用的d.m.Y会为您提供01.04.2014。是4月1日还是1月4日? PHP并不知道在这种情况下猜测。如果您使用Y-m-d,那么您将获得预期的结果,因为该格式对PHP不明确。

Demo

var_dump(strtotime("01.04.2014"));
var_dump(strtotime("04.01.2014"));
var_dump(strtotime("2014-04-01"));
int(1396310400) 
int(1388793600) 
int(1396310400)