PHP 7.2中如何通过UNIX时间戳一步获取时区偏移量?
解决PHP中用UNIX时间戳获取时区偏移量的问题
你碰到的这个情况其实是PHP DateTime构造函数的一个小特性——当你用@前缀的UNIX时间戳初始化DateTime时,不管你第二个参数传什么时区,这个对象都会被强制设为UTC时区,所以getOffset()返回0完全是意料之中的,毕竟UTC本身的时区偏移就是0嘛。
想要一步到位通过时间戳获取指定时区的偏移量,这里有几个实用的方法:
方法1:用setTimestamp()创建带时区的DateTime对象
先初始化一个带目标时区的DateTime实例,再用setTimestamp()把时间切换到你要的时间戳,这样时区不会被覆盖:
$dt = (new DateTime(null, new DateTimeZone(date_default_timezone_get())))->setTimestamp(1522680410); $tz_offset = $dt->getOffset();
这里new DateTime(null, ...)会创建一个当前时间的对象,但立刻用setTimestamp()替换成目标时间戳,最终对象的时区是你指定的默认时区,能正确计算偏移。
方法2:用DateTime::createFromFormat直接构建
利用createFromFormat方法,指定格式为U(代表UNIX时间戳),同时传入时区参数:
$dt = DateTime::createFromFormat('U', '1522680410', new DateTimeZone(date_default_timezone_get())); $tz_offset = $dt->getOffset();
这种方式更直接,一步创建出对应时区下该时间戳的DateTime对象,不用额外调整。
方法3:直接用timezone_offset_get()函数
如果你不需要完整的DateTime对象,只是想获取偏移量,可以用这个函数直接计算:
$target_timezone = new DateTimeZone(date_default_timezone_get()); // 创建一个UTC时区的DateTime(对应目标时间戳) $utc_dt = date_create('@1522680410'); $tz_offset = timezone_offset_get($target_timezone, $utc_dt);
这个函数的作用就是计算指定时区相对于另一个DateTime对象(这里是UTC时间)的偏移量,结果完全准确。
选哪种方法看你的实际需求——如果后续还要对这个时间做其他操作,方法1或2更合适;如果只需要偏移量,方法3最轻便。
内容的提问来源于stack exchange,提问作者raphael75
相关产品推荐
相关产品推荐

