如何将时间差值变量添加到PHP日期时间变量中
问题:如何将时间差值变量引入日期计算?
服务器API返回的是GMT时间,我已经算出本地时间和GMT的小时差值变量$ts3,现在想把这个差值加到指定日期变量$menue_datum里,但不知道怎么正确插入$ts3。
我之前的差值计算代码是这样的:
$df = "G:i:s"; // 用简单时间格式计算差值 $tz = 'Europe/Berlin'; $tz_obj = new DateTimeZone($tz); $today = new DateTime("now", $tz_obj); $ts1 = $today->format($df); // 本地时间 $ts2 = gmdate($df); // 当前UTC时间戳 $ts3 = $ts1-$ts2; // 差值应该是2
用固定差值的代码能正常运行:
$newDate = date('Y-m-d H:i:s', strtotime($menue_datum. ' + 2 hours'));
但我尝试插入变量的写法不确定是否正确:
$newDate = date('Y-m-d H:i:s', strtotime($menue_datum. ' + {$ts3} hours'));
先修正时间差值计算逻辑
你当前计算$ts3的方式是错误的:直接用格式化后的时间字符串相减,本质是把字符串转成数字后运算(比如"14:00:00"会被转成14),如果遇到跨天的情况(比如本地是凌晨1点,GMT是前一天23点),结果会完全错误。正确的计算方式应该是:
$tz = 'Europe/Berlin'; $tz_obj = new DateTimeZone($tz); // 方式1:通过时间戳计算差值 $local_time = new DateTime("now", $tz_obj); $utc_time = new DateTime("now", new DateTimeZone('UTC')); $ts3 = ($local_time->getTimestamp() - $utc_time->getTimestamp()) / 3600; // 方式2:直接获取时区偏移(更高效) $ts3 = $tz_obj->getOffset(new DateTime()) / 3600;
正确插入变量的两种写法
你尝试的写法问题在于:单引号包裹的字符串里,{$ts3}不会被解析成变量值,而是直接当作字符串处理。可以用以下两种正确写法:
- 字符串拼接方式
$newDate = date('Y-m-d H:i:s', strtotime($menue_datum . ' + ' . $ts3 . ' hours'));
- 双引号解析变量方式
如果用双引号包裹整个strtotime的参数,变量会自动被解析:
$newDate = date('Y-m-d H:i:s', strtotime("$menue_datum + $ts3 hours"));
内容的提问来源于stack exchange,提问作者Ahmet
相关产品推荐
相关产品推荐

