php time 不对

笔记2024-04-194 人已阅来源:网络

最近我遇到了一个非常奇怪的问题,就是php中的time()函数总是返回一个错误的时间。这个问题让我头疼了好久,我尝试了各种方法,包括修改服务器的时区设置、重新安装PHP,但问题依然存在。

举个例子,我在美国东部的服务器上运行一个PHP脚本。当我打印出当前的Unix时间戳时,它返回的是格林威治标准时间(GMT)而不是美国东部时间。这显然是不正确的,因为服务器设置的时区应该是美国东部。具体代码如下:

echo time(); // 返回的时间戳是GMT而不是美国东部时间

我开始怀疑时区设置的问题,于是我尝试了各种方法去修改服务器的时区设置。我在php.ini文件和Apache的httpd.conf文件中修改了时区设置,但都没有起到任何作用。代码如下:

; php.ini
date.timezone = "America/New_York"
; httpd.conf
SetEnv TZ America/New_York

为了更好地排查问题,我在脚本中添加了更多的代码来测试时区设置。下面是我的测试代码:

echo 'default timezone: ' . date_default_timezone_get() . "\n"; // 输出的是America/New_York
echo 'date(): ' . date('Y-m-d H:i:s') . "\n"; // 输出的是GMT时间
echo 'gmdate(): ' . gmdate('Y-m-d H:i:s') . "\n"; // 输出的是GMT时间
echo 'time(): ' . time() . "\n"; // 返回的时间戳是GMT而不是美国东部时间

从这些输出结果中,我发现date_default_timezone_get()函数返回的是正确的时区设置,而date()和gmdate()函数返回的却是GMT时间。难道是PHP的Bug?

最终,我发现了问题的真正原因:代码运行在Docker容器中,Docker容器的时区设置是UTC。解决方法很简单,就是在容器启动时通过环境变量设置时区即可。具体代码如下:

# 在Dockerfile中
ENV TZ=America/New_York
# 在docker-compose.yml中
environment:
TZ: 'America/New_York'

经过这样的修改之后,问题得到了解决。现在,我的PHP脚本返回的时间戳是正确的美国东部时间。这次经历让我领悟到,有时候问题的原因可能比我们想象的要简单或者复杂得多。做好问题排查的基础工作是非常重要的。