php – strtotime()认为有害吗?

前端之家收集整理的这篇文章主要介绍了php – strtotime()认为有害吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
好像很多人在 PHP中遇到日期/时间问题,不可避免地有许多接受的答案往往是“ Use strtotime in this way”.

这真的是指导处理日期问题的人的最佳方式吗?我开始觉得strtotime是一种很有趣的技巧,它不一定要依赖于重要的日期/时间计算,而且它的性质是随意的字符串,它似乎是潜在的bug,预测行为.不能区分MM / DD / YYYY和DD / MM / YYYY是一件很大的事情,不是吗?

StackOverflow通常非常好的推广良好做法(我很少看到一个没有人说“使用PDO代替”的MysqL_real_escape_string对话.)

但是PHP中的日期问题似乎并不是一个被接受的规范,很多人掉落在strtotime的拐杖上.

那么,如果有什么事情我们该怎么做呢?有没有一个更好的规范,我们应该为人们提出问题,例如“如何添加1周X”,或“如何将此日期格式转换为其他日期格式?”

什么是最好的,最可靠的方式来处理日期/时间问题,如strtotime尝试,但往往没有?

我先说说,我是使用DateTime对象的大提倡者,它允许您使用 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().

原文链接:https://www.f2er.com/php/132638.html

猜你在找的PHP相关文章