我首先要说我是使用 DateTime 对象的大力倡导者,它允许您使用该DateTime::createFromFormat()
函数。DateTime 对象使代码更具可读性,并避免了使用 60 * 60 * 24 进行整个 Unix 时间戳修改以提前日期天数的需要。
话虽如此,strtotime() 采用的任意字符串并不难预测。支持的日期和时间格式列出了支持的格式。
根据您无法区分 MM/DD/YYYY 和 DD/MM/YYYY 的示例,它确实根据Date Formats进行区分。使用斜线的日期始终以美国格式读取。因此,格式为 00/00/0000 的日期将始终被读取为 MM/DD/YYYY。或者使用破折号或句点将是 DMY。例如,00-00-0000 将始终被读取为 DD-MM-YYYY。
这里有些例子:
<?php
$dates = array(
// MM DD YYYY
'11/12/2013' => strtotime('2013-11-12'),
// Using 0 goes to the previous month
'0/12/2013' => strtotime('2012-12-12'),
// 31st of November (30 days) goes to 1st December
'11/31/2013' => strtotime('2013-12-01'),
// There isn't a 25th month... expect false
'25/12/2013' => false,
// DD MM YYYY
'11-12-2013' => strtotime('2013-12-11'),
'11.12.2013' => strtotime('2013-12-11'),
'31.12.2013' => strtotime('2013-12-31'),
// There isn't a 25th month expect false
'12.25.2013' => false,
);
foreach($dates as $date => $expected) {
assert(strtotime($date) == $expected);
}
正如您所看到的,有几个关键示例25/12/2013
,12.25.2013
如果以相反的格式读取它们都是有效的,但是false
根据支持的日期和时间格式,它们会返回,因为它们是无效的......
所以你可以看到行为是完全可以预测的。与往常一样,如果您收到使用输入的日期,您应该首先验证该输入。如果您不先验证输入,则任何方法都不起作用。
如果您想非常具体地了解正在读取的日期,或者您获得的格式不是受支持的格式,那么我建议使用DateTime::createFromFormat()
.