strtotime
in this way”.
这真的是指导处理日期问题的人的最佳方式吗?我开始觉得strtotime是一种很有趣的技巧,它不一定要依赖于重要的日期/时间计算,而且它的性质是随意的字符串,它似乎是潜在的bug,预测行为.不能区分MM / DD / YYYY和DD / MM / YYYY是一件很大的事情,不是吗?
StackOverflow通常非常好的推广良好做法(我很少看到一个没有人说“使用PDO代替”的MysqL_real_escape_string对话.)
但是PHP中的日期问题似乎并不是一个被接受的规范,很多人掉落在strtotime的拐杖上.
那么,如果有什么事情我们该怎么做呢?有没有一个更好的规范,我们应该为人们提出问题,例如“如何添加1周X”,或“如何将此日期格式转换为其他日期格式?”
什么是最好的,最可靠的方式来处理日期/时间问题,如strtotime尝试,但往往没有?
DateTime::createFromFormat()
功能. DateTime对象使代码更易于阅读,避免使用60 * 60 * 24进行整个Unix时间戳修改来提前日期.
话虽如此,strtotime()采用的任意字符串并不难预测. Supported Date and Time Formats列出了支持的格式.
根据您无法区分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().