-2

我试图添加 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 );

返回有效日期。

4

5 回答 5

2

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

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

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

于 2012-10-25T13:11:03.227 回答
2

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

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

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

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

解决方案是:

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

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

希望有帮助。

于 2012-10-25T13:11:46.533 回答
0

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

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

于 2012-10-25T13:12:04.087 回答
0

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

尝试将您的日期生成更改为:

$intTime = strtotime('2012-10-25 +3 days');
于 2012-10-25T13:12:49.427 回答
0

尝试添加:

date_default_timezone_set('UTC');
于 2012-10-25T13:12:55.303 回答