Php strotime()被认为有害吗?
似乎很多人都在为PHP中的日期/时间问题而挣扎,而且不可避免地,许多被接受的答案往往是“时间” 这真的是指导人们处理约会问题的最好方法吗?我开始觉得strotime是一种巧妙的技巧,在重要的日期/时间计算中不必依赖它,而且由于它采用任意字符串的性质,它似乎是一种潜在的错误源,难以预测的行为。它无法区分MM/DD/YYYY和DD/MM/YYYY有点大不了,不是吗 StackOverflow通常非常擅长推广良好的实践(我很少看到一个Php strotime()被认为有害吗?,php,date,strtotime,Php,Date,Strtotime,似乎很多人都在为PHP中的日期/时间问题而挣扎,而且不可避免地,许多被接受的答案往往是“时间” 这真的是指导人们处理约会问题的最好方法吗?我开始觉得strotime是一种巧妙的技巧,在重要的日期/时间计算中不必依赖它,而且由于它采用任意字符串的性质,它似乎是一种潜在的错误源,难以预测的行为。它无法区分MM/DD/YYYY和DD/MM/YYYY有点大不了,不是吗 StackOverflow通常非常擅长推广良好的实践(我很少看到一个mysql\u real\u escape\u string对话没有
mysql\u real\u escape\u string
对话没有人说“改用PDO”。)
但是在PHP中,关于日期问题似乎没有一个公认的标准,很多人都依赖于strotime
那么,如果有什么问题的话,我们应该怎么做呢?有没有更好的规范,我们应该强制执行的人提出的问题,如“如何将1周添加到X”,或“如何将此日期格式转换为其他日期格式?”
处理日期/时间问题(如strotime
尝试但往往失败)的最佳、最可靠的方法是什么?我经常使用strotime()
。问题是,你们不应该把它当作拐杖,但你们应该意识到它的局限性
如果您想强制执行一个标准,那么我认为您应该使用基于c的mktime()
。例如,要在1周后获得:
date('Y-m-d', mktime(0, 0, 0, date('n'), date('j') + 7);
建议使用strotime()
,因为它从v4.x开始就在PHP中,因此基本上保证可用。可用性胜过奇怪的时间(没有双关语的意思),它会反过来用错误解析的日期咬你的屁股
当前进行日期计算的“正确”方法是使用DateTime/DateInterval对象,但这些对象是PHP中最近添加的(我认为是5.2/5.3),因此并不总是可用的-在4.x上仍然有很多主机。首先,我要说的是,我非常支持使用DateTime对象,允许您使用该功能。DateTime对象使代码更具可读性,并且避免了使用60*60*24修改整个Unix时间戳以提前日期的需要 也就是说,strotime()使用的任意字符串并不难预测。列出支持的格式 根据您无法区分MM/DD/YYYY和DD/MM/YYYY的示例,它确实基于。使用斜杠的日期总是以美式格式读取。因此,格式为00/00/0000的日期将始终被读取为MM/DD/YYYY。或者,使用破折号或句点将是DMY。e、 g.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);
}
Derek Rethans于2010年10月30日在Froscon举行了一次演讲 请在中以PDF格式查找幻灯片。这些依赖于最新的PHP(5.2及以上版本),使用它也是最佳实践。更新:For PHP>=5.3应改用。注意
strtime()
在不同的操作系统上可能有不同的行为,因为它依赖于系统的C库公开的strtime()
PHP中最可靠的日期计算方法是使用时间戳
诚然,它受到32位整数的限制,但在某些奇怪的环境中键入时,使用Date对象不是一个选项,例如PHP4
为了确保获得最正确的行为,我建议使用strtime()
从人类可读的日期获取时间戳。这比strotime()
和strftime()
要好,因为它不会尝试猜测日期的格式,而是使用您提供的日期格式
在获得正确的时间戳后,您可以使用PHP中的多种方法来完成工作。问题是,您必须在应用程序的所有层中为日期/时间/区域值(ISO8601:2004)选择严格的数据格式,并找到最能处理此格式的PHP函数,这是:
DateTime::createFromFormat()。
IMHO具有不同的日期/时间/区域格式是针对用户界面(GUI层),尝试猜测PHP函数中的日期输入意味着您没有从客户端对数据执行任何清理(可能使用Javascript?),并且您正在以未知格式从web公式传输数据
如果服务器端的日期/时间/区域格式与ISO8601不匹配,您只需拒绝它,等等
希望这有帮助 这在PHP中当然是可能的:请检查
如果您有可用的MySQL连接,选择日期添加('2011-05-31',间隔1个月)将减少冗余,因为(正确的)功能已经实现,您无需自己实现。Nah,
mktime
不能在1970年之前实现。改为使用DateTime/DateInterval对象。PHP4.x上没有那么多主机。gophp5.org项目在2008年宣布成功,Wordpress也很快放弃了支持。