PHP中伦敦时间转印度时间及GMT转印度时间的实现问询
伦敦/GMT时间转印度时间的正确实现方案
嘿,我来帮你搞定这个时区转换的问题!先直接给结论:你提到的setTimezone方法是正确且推荐的实现方式,比手动加减5:30/4:30靠谱多了,下面给你详细拆解原因和优化方案。
为什么你的代码可行?
PHP的DateTime类配合DateTimeZone会自动处理时区规则(包括夏令时切换),所以只要你初始的$time对象是正确的伦敦/GMT时间,调用setTimezone(new DateTimeZone('IST'))就能准确转成印度时间。不过这里有个小细节要注意:IST是一个模糊的时区代码(全球有好几个地区都用IST缩写),更稳妥的方式是用明确的时区标识Asia/Kolkata,避免歧义。
手动加减的坑
你提到的手动加5:30或4:30,最大的问题是伦敦有夏令时(BST):
- 每年3-10月,伦敦用BST(比GMT快1小时),和印度IST的时差是4小时30分
- 其余时间用GMT,时差是5小时30分
手动处理需要自己判断当前是否处于夏令时,不仅代码繁琐,还容易因为时区规则更新出错(比如夏令时的起始/结束日期可能调整)。而用DateTimeZone的方法会自动读取系统内置的时区规则,完全不用你操心这些细节。
完整的正确代码示例
// 1. 创建伦敦时间的DateTime对象(自动处理GMT/BST切换) // 用Europe/London比直接用GMT好,因为它会自动适配夏令时 $londonTime = new DateTime('now', new DateTimeZone('Europe/London')); // 2. 转换为印度标准时间(用Asia/Kolkata替代IST更明确) $indianTime = clone $londonTime; // 克隆对象避免修改原时间 $indianTime->setTimezone(new DateTimeZone('Asia/Kolkata')); // 3. 输出结果 echo "伦敦时间: " . $londonTime->format('Y-m-d H:i:s') . "\n"; echo "印度时间: " . $indianTime->format('Y-m-d H:i:s') . "\n";
注意:这里用clone是为了保留原伦敦时间的对象,如果不需要保留原对象,直接调用setTimezone修改原对象也可以。
额外说明
如果你的初始时间是GMT(固定时区,不考虑夏令时),也可以直接转换:
$gmtTime = new DateTime('now', new DateTimeZone('GMT')); $indianTime = $gmtTime->setTimezone(new DateTimeZone('Asia/Kolkata'));
这种情况下,时差永远是5小时30分,代码同样能正确计算。
内容的提问来源于stack exchange,提问作者Arun Srt
相关产品推荐
相关产品推荐

