Greenland与Kazakhstan地区PHP时间函数返回错误的解决方法
如何获取格陵兰(Greenland)和哈萨克斯坦(Kazakhstan)的正确时间?
问题背景
使用date_default_timezone_set()和date()函数时,除格陵兰与哈萨克斯坦外,其余地区均可返回正确的日期与时间:
- 格陵兰地区:调用
America/Nuuk时区返回的时间比实际晚1小时 - 哈萨克斯坦地区:调用
Asia/Almaty时区返回的时间比实际早1小时
对应问题代码:
格陵兰问题代码
date_default_timezone_set("America/Nuuk"); echo date("Y-m-d H:i:s");
哈萨克斯坦问题代码
date_default_timezone_set("Asia/Almaty"); echo date("Y-m-d H:i:s");
问题原因
这两个地区的时区规则在PHP依赖的tzdata(时区数据库)中存在滞后,未同步当地最新的时区偏移或夏令时取消政策。
临时修复方案
格陵兰(Nuuk)
Nuuk当前采用UTC-2(全年无夏令时),可直接使用固定偏移时区替代:
// 注意:Etc/GMT+2对应UTC-2,规则为GMT+N等价于UTC-N date_default_timezone_set("Etc/GMT+2"); echo date("Y-m-d H:i:s");
或使用更灵活的DateTime类:
$datetime = new DateTime("now", new DateTimeZone("Etc/GMT+2")); echo $datetime->format("Y-m-d H:i:s");
哈萨克斯坦(Almaty)
Almaty当前采用UTC+6(全年无夏令时),同样使用固定偏移时区:
// 注意:Etc/GMT-6对应UTC+6,规则为GMT-N等价于UTC+N date_default_timezone_set("Etc/GMT-6"); echo date("Y-m-d H:i:s");
或DateTime实现:
$datetime = new DateTime("now", new DateTimeZone("Etc/GMT-6")); echo $datetime->format("Y-m-d H:i:s");
长期解决办法
更新PHP环境的tzdata时区数据库:
- Linux系统:通过包管理器(如apt、yum)更新
tzdata系统包 - Windows系统:更新PHP的
timezonedb扩展,或升级到包含最新tzdata的PHP版本
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

