我尝试添加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 );
返回有效日期。
答案 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>
这就是为什么你会得到这种奇怪的效果。
解决方案是:
让您的系统仅在UCT时间工作,而不是在当地时间。 UCT没有夏令时,所以不会受此影响。如果您需要以本地格式输入或输出时间,请在执行任何其他操作之前进行转换。您可以在PHP.ini文件中或使用date_default_timezone_set()
function将系统设置为UCT。
使用PHP的DateTime
class代替旧式日期函数。默认情况下,此类在UCT中工作,并包含date_add()
方法,允许您指定天数,完全绕过整个问题。 (该类还有许多其他不错的功能,比旧式功能更好,更容易使用)
**注意:DateTime::add()
方法仅适用于PHP 5.3。如果你坚持使用5.2就不能使用它(但如果是这样的话,我也强烈建议你升级,因为你已经过时了)
希望有所帮助。
答案 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');