MP_*_*bby 5 php time timezone date timezone-offset
我需要计算出两个时区之间的小时差,当前面的时区移动到第二天时,我遇到了一些问题。
例子:
//Let's say it is 11pm 23:00 in LA
$local_tz = new DateTimeZone('America/Los_Angeles');
$local = new DateTime('now', $local_tz);
$local_hour = $local->format('H');
//NY is 3 hours ahead, so it is 2am, 02:00
$user_tz = new DateTimeZone('America/New_York');
$user = new DateTime('now', $user_tz);
$user_hour = $user->format('H');
Run Code Online (Sandbox Code Playgroud)
按照这个问题中的例子(计算不同时区日期之间的小时数)我得到了一个不正确的结果:
$diff = $user_tz->getOffset($local);
error_log('$diff '.gmdate("H:i:s", $diff)); //outputs 20:00:00
Run Code Online (Sandbox Code Playgroud)
如果在洛杉矶是下午 4 点,那么在纽约是下午 7 点,那么很容易:
$time_diff = ($user_h - $local_h); //$time_diff = 3;
Run Code Online (Sandbox Code Playgroud)
但是当纽约移动到第二天时,我再次得到错误的结果:
$time_diff = ($user_h - $local_h); //$time_diff = -21;
Run Code Online (Sandbox Code Playgroud)
那么我该如何解释另一个时区已经移动到新的一天呢?
Abu*_*ouq 10
您可以使用时区偏移尝试以下代码来获得两个时区之间的小时数差异:
$local_tz = new DateTimeZone('America/Los_Angeles');
$local = new DateTime('now', $local_tz);
//NY is 3 hours ahead, so it is 2am, 02:00
$user_tz = new DateTimeZone('America/New_York');
$user = new DateTime('now', $user_tz);
$local_offset = $local->getOffset() / 3600;
$user_offset = $user->getOffset() / 3600;
$diff = $user_offset - $local_offset;
print_r($diff); //outputs 3
Run Code Online (Sandbox Code Playgroud)
我设法找到了解决方案,DateInterval 类也不断为我抛出 21,尽管当我输出对象时我可以看到小时为 3。
由于 DateTime 与纪元进行比较并忽略时区,因此我必须为两个时间创建一个新的 DateTime,然后运行比较。
//Let's say it is 11pm 23:00 in LA
$local_tz = new DateTimeZone('America/Los_Angeles');
$local = new DateTime('now', $local_tz);
//NY is 3 hours ahead, so it is 2am, 02:00
$user_tz = new DateTimeZone('America/New_York');
$user = new DateTime('now', $user_tz);
$usersTime = new DateTime($user->format('Y-m-d H:i:s'));
$localsTime = new DateTime($local->format('Y-m-d H:i:s'));
$interval = $usersTime->diff($localsTime);
print_r($interval->h); //outputs 3
Run Code Online (Sandbox Code Playgroud)
运行$user->modify("-4 hours"); $local->modify("-4 hours");
返回 3 的测试(其中一个将在前一天午夜之前进行)