来看两段代码

代码1(时区设为巴黎):

<?php

// 时区设为:欧洲巴黎
date_default_timezone_set('Europe/Paris');

$time1 = 1615776600;
$time2 = strtotime('+30 day', $time1);

echo 'time1: ' . $time1 . ', format: ' . date('Y-m-d H:i:s', $time1);
echo "\n";

echo 'time2: ' . $time2 . ', format: ' . date('Y-m-d H:i:s', $time2);
echo "\n";

?>

// 输出结果如下
time1: 1615776600, format: 2021-03-15 03:50:00
time2: 1618365000, format: 2021-04-14 03:50:00

代码2(时区设为上海):

<?php

// 时区设为:亚洲上海
date_default_timezone_set('Asia/Shanghai');

$time1 = 1615776600;
$time2 = strtotime('+30 day', $time1);

echo 'time1: ' . $time1 . ', format: ' . date('Y-m-d H:i:s', $time1);
echo "\n";

echo 'time2: ' . $time2 . ', format: ' . date('Y-m-d H:i:s', $time2);
echo "\n";

?>

// 输出结果如下
time1: 1615776600, format: 2021-03-15 10:50:00
time2: 1618368600, format: 2021-04-14 10:50:00

已知巴黎时区比上海时区慢7个小时,对比两段代码的执行结果,两个 $time1 格式化后显示没有问题,$time2 格式化后显示也是差7个小时。然而,同样是 +30 day,两个 $time2 的时间戳却不同,相差了3600秒,也就是1小时。

为什么会出现这样的结果呢?这就跟国外实现的夏令时/冬令时有关。我国早些年也实行过夏令时,后来取消了。知乎上有两篇文章,可以看下:

冬令时转夏令时,少睡一小时!
https://zhuanlan.zhihu.com/p/126721764

为什么中国实行夏时制取消了,而美国这么多年能够一直实行夏时制?
https://www.zhihu.com/question/20309772

综述,你已经知道,不同时区对 strtotime 函数的执行结果会有影响,如果将上述代码 strtotime('+30 day', $time1) 改为 $time1 + 3600 * 24 * 30,得到的 $time2 时间戳才是一样的,但格式化成日期显示后,巴黎时区却又多出了1个小时。实际应用中,到底要用那种算法,应该取决于产品需求吧。