PHP7.4 IIS环境下date()函数不同用户返回值存在差异问题问询
根因分析
- 所有时间逻辑均在服务端执行,和用户本地设备配置无关,问题出在服务端集群配置不一致。
- 代码中
date("Y-m-d H:i:s")依赖PHP配置的默认时区(php.ini中date.timezone参数)或服务器操作系统的时区,而你手动指定Australia/Brisbane时区生成的Local Time不受默认配置影响,所以异常用户的Local Time始终正确,只有Machine Date输出异常。 - 你的服务端应该使用了负载均衡集群,其中2台节点的时区配置和其余节点不一致:正常节点的操作系统/PHP默认时区设为温哥华时区,异常节点的操作系统/PHP默认时区被错误设置为澳大利亚有夏令时的时区(如Australia/Sydney,2021年12月夏令时为UTC+11,比布里斯班的UTC+10快1小时),所以异常节点返回的
Machine Date比布里斯班时间快1小时,和你给出的异常输出完全吻合。
解决方案
1. 统一服务端配置
- 检查集群内所有服务器的操作系统时区,确保所有节点配置一致,推荐统一设为UTC或温哥华时区。
- 检查所有节点的系统时钟,配置NTP时间同步,保证所有服务器的系统时间完全一致。
- 检查所有节点
php.ini中的date.timezone参数,确保所有节点配置统一,推荐统一设置为UTC,避免默认时区不一致导致的问题。
2. 代码层面优化(彻底规避此类问题)
- 如果不需要展示服务器本地时间,直接删除
date()相关的代码即可,你已经通过显式指定时区的方式拿到了正确的布里斯班时间,不受服务端默认配置影响。 - 如果确实需要展示服务器时间,不要依赖PHP默认时区,所有时间操作都显式指定时区:
// 统一显式指定时区,不受默认配置影响 $serverTz = new DateTimeZone('America/Vancouver'); $userTz = new DateTimeZone('Australia/Brisbane'); $serverNow = new DateTime('now', $serverTz); $userNow = new DateTime('now', $userTz); $html = '<br>Machine Date: '. $serverNow->format("Y-m-d H:i:s"); $html .= '<br>TimeZone: Australia/Brisbane'; $html .= '<br>Local Time: '. $userNow->format('Y-m-d H:i:s') ;
内容的提问来源于stack exchange,提问作者Angus Walker
相关产品推荐
相关产品推荐

