strtotime(“2017年9月5日星期一”)返回“2017年10月2日”?

时间:2017-09-13 13:42:40

标签: php strtotime

有谁知道如何让它返回false?

9月没有第5个星期一,所以这个函数返回:2017年10月2日

date("jS F, Y", strtotime("fifth monday september 2017"));

1 个答案:

答案 0 :(得分:2)

PHP strtotime基于GNU的日期解析C函数(IIRC它实际上调用了这个C函数而不是使用它自己的实现)。来自GNU documentation

  

明确提及一周中的某一天会将日期(仅在必要时)提前到达未来一周中的那一天......一个数字可能会在一周中的某一项之前推进补充周。

因此,您不会直接从strtotime获得您提供的示例的错误结果。如果您想确认结果是在同一个月,您可以执行以下操作:

$timestamp = strtotime("fifth monday september 2017");
$month = date('n', strtotime("september 1, 2017"));
$same_month = (date('n', $timestamp) === $month);

同样from the GNU documentation,添加一些观点:

  

我们的时间测量单位,从几秒钟到几个月,是如此复杂,不对称和分离,以便及时做出连贯的心理计算,这几乎是不可能的......与更成功的语言和科学模式不同我们要大胆地或者至少是平等地面对经验,我们的时间计算系统默默地,持续地鼓励我们对时间的恐惧......难怪我们经常看到我们自己的近期或未来,上周二或一周从周日开始,感到无助的困惑。

     

-Robert Grudin,时间和生活的艺术