Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.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函数。缺陷_Php_Date - Fatal编程技术网

奇怪的行为日期()php函数。缺陷

奇怪的行为日期()php函数。缺陷,php,date,Php,Date,我试着增加3天和4天。问题是date()在这两种情况下返回相同的日期。为什么? $intTime = strtotime('2012-10-25')+(3*86400); date('Y-m-d', $intTime ); $intTime = strtotime('2012-10-25')+(4*86400); date('Y-m-d', $intTime ); 返回2012-10-28 PHP 5.2.6-1 及 时区:欧洲/华沙,菲律宾:5.2.17 但是 返回有效日期。您可能希望使用

我试着增加3天和4天。问题是date()在这两种情况下返回相同的日期。为什么?

$intTime = strtotime('2012-10-25')+(3*86400);
date('Y-m-d', $intTime );

$intTime = strtotime('2012-10-25')+(4*86400);
date('Y-m-d', $intTime );
返回2012-10-28

PHP 5.2.6-1

时区:欧洲/华沙,菲律宾:5.2.17

但是


返回有效日期。

您可能希望使用不同的方法添加一天内容-这更容易理解:

$time = strtotime('+3 day',strtotime('2012-10-25'));
$data = date('Y-m-d', $time);

我不确定上面的内容是否会考虑到夏令时,但是正如Michael Berkowski所提到的。

不,这不是PHP中的错误——你正在违反夏令时

使用
strotime()
创建的日期没有指定时间,因此默认为午夜(即00:00:00)

当你在时间戳上加上24小时,它通常会在第二天的同一时间结束。然而,由于在某些国家,本周末是夏令时的结束日,因此这一天会延长一个小时——因此,加上24小时,时间戳会映射到当天23点

这就是为什么你会得到这种奇怪的效果

解决办法是:

  • 让您的系统只在UCT时间工作,而不是本地时间。UCT没有夏令时,因此不会受此影响。如果您需要以本地格式输入或输出时间,请在执行任何其他操作之前对其进行转换。可以在PHP.ini文件中或通过使用将系统设置为UCT

  • 使用PHP代替旧式的日期函数。默认情况下,此类在UCT中工作,并包含一个
    date\u add()
    方法,该方法允许您指定天数,完全绕过整个问题。(该类还有许多其他优秀的功能,比旧式功能更好、更易于使用)。
    **注意:
    DateTime::add()
    方法仅在PHP5.3中可用。如果你被5.2卡住了,你就不能使用它(但如果是这样,我也强烈建议你升级,因为你已经严重过时了)


  • 希望这能有所帮助。

    根据你的时区、日期、DST、月相以及那天早上是否见过黑猫,两个时间戳可能会在同一天结束,一个在清晨,另一个在深夜。一天并不总是86400秒长


    使用适当的日期/时间处理功能。可以使用
    +3天
    语法添加时间,可以使用一些涉及的数学来创建新的时间戳,但该类是操作时间戳的最健壮和通用的方法。

    通常,当您在一个时区中,在这些日期中经历夏令时,会发生这种情况。当这种情况发生时,添加
    86400
    是错误的,因为现在一天中不再有86400秒

    尝试将日期生成更改为:

    $intTime = strtotime('2012-10-25 +3 days');
    
    尝试添加:

    date_default_timezone_set('UTC');
    

    这对我有用。返回2012-10-28和2012-10-29。当你回显它们时会返回什么日期?+1@Trevor,我也是。您是否在水星上运行服务器;)我想我们需要看看你用来输出日期的实际代码。。。这将有助于在您的区域设置中,您可能会遇到夏时制更改()的冲突。简单地增加86400对于增加天数来说是不可靠的。您所在的时区是什么?时钟在这个周末会改变吗?是的,这会返回有效日期。谢谢。没问题,很高兴知道它似乎考虑了一天的长度:)而且我不知道你可以像
    strotime('2012-10-25+3天')那样使用它-+1很好找到了。
    
    date_default_timezone_set('UTC');