奇怪的行为date()php函数。错误?

时间:2012-10-25 13:00:15

标签: 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

时区:欧洲/华沙,PHP:5.2.17

但是

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

$intTime = strtotime('2012-10-25 +4 days'); 
echo date('Y-m-d', $intTime );

返回有效日期。

5 个答案:

答案 0 :(得分:2)

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

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

我不确定上述情况是否会考虑到夏令时,但正如Michael Berkowski所说。

答案 1 :(得分:2)

不,这不是PHP中的错误 - 你正在减少夏令时。

您使用strtotime()创建的日期未指定时间,因此默认为午夜(即00:00:00)。

当您将24小时添加到时间戳时,它通常会在第二天的同一时间结束。但是,因为这个周末是某些国家/地区夏令时的结束,所以特定日期会延长一个小时 - 因此添加24小时最终会在同一天将时间戳映射到23h00 。 / p>

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

解决方案是:

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

  2. 使用PHP的DateTime class代替旧式日期函数。默认情况下,此类在UCT中工作,并包含date_add()方法,允许您指定天数,完全绕过整个问题。 (该类还有许多其他不错的功能,比旧式功能更好,更容易使用) **注意:DateTime::add()方法仅适用于PHP 5.3。如果你坚持使用5.2就不能使用它(但如果是这样的话,我也强烈建议你升级,因为你已经过时了)

  3. 希望有所帮助。

答案 2 :(得分:0)

根据您的时区,日期,夏令时,月相以及您是否在早上看到黑猫,两个时间戳可能会在同一天结束,一个清晨,另一个结束晚。一天不是一直持续86400秒。

使用正确的日期/时间处理功能。 strtotime可以使用+3 days语法添加时间,mktime可用于创建包含一些数学的新时间戳,但DateTime类是最强大和通用的操作方法时间戳。

答案 3 :(得分:0)

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

尝试将日期生成更改为:

$intTime = strtotime('2012-10-25 +3 days');

答案 4 :(得分:0)

尝试添加:

date_default_timezone_set('UTC');