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


Different results for "first day of previous month"

为什么我得到不同的结果

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)

使用date('d.m.Y')将切断小时,分钟和秒。从而返回给您午夜的时间戳。

如果您使用strtotime而不通过date过滤它,它将根据当前时间返回小时、分钟和秒。在这里,您通常在午夜后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

这与strtotime()如何解释您的日期字符串有关。

strtotime()的文档:

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

date()的格式很重要,因为strtotime将根据不同的格式解释它。坚持使用标准格式,如YYYY-MM-DD,你会得到预期的结果。

在你的例子中,你使用d.m.Y,它会给你01.04.2014。是4月1日还是1月4日?PHP不知道,所以在这里只能猜测。如果您使用Y-m-d,您将得到预期的结果,因为该格式对PHP没有歧义。

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