Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php strotime()被认为有害吗?_Php_Date_Strtotime - Fatal编程技术网

Php strotime()被认为有害吗?

Php strotime()被认为有害吗?,php,date,strtotime,Php,Date,Strtotime,似乎很多人都在为PHP中的日期/时间问题而挣扎,而且不可避免地,许多被接受的答案往往是“时间” 这真的是指导人们处理约会问题的最好方法吗?我开始觉得strotime是一种巧妙的技巧,在重要的日期/时间计算中不必依赖它,而且由于它采用任意字符串的性质,它似乎是一种潜在的错误源,难以预测的行为。它无法区分MM/DD/YYYY和DD/MM/YYYY有点大不了,不是吗 StackOverflow通常非常擅长推广良好的实践(我很少看到一个mysql\u real\u escape\u string对话没有

似乎很多人都在为PHP中的日期/时间问题而挣扎,而且不可避免地,许多被接受的答案往往是“时间”

这真的是指导人们处理约会问题的最好方法吗?我开始觉得strotime是一种巧妙的技巧,在重要的日期/时间计算中不必依赖它,而且由于它采用任意字符串的性质,它似乎是一种潜在的错误源,难以预测的行为。它无法区分MM/DD/YYYY和DD/MM/YYYY有点大不了,不是吗

StackOverflow通常非常擅长推广良好的实践(我很少看到一个
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也很快放弃了支持。