1

我一直在使用 DATETIME 列将用户消息存储在我的数据库中。我需要向不同国家的用户显示消息的发送时间,因为数据库使用 GMT+0 我需要将检索到的时间调整为用户的时区。

当前用户的时区已使用 date_default_timezone_set() 设置我如何获得它的 GMT +- 时间?

编辑

遵循@doniyor 的想法,这就是我所做的:

 // Get server hour
$localtime = localtime();
$serverHour = $localtime[2]; # The server's timezone is used by default before defining one

// Set timezone
date_default_timezone_set('user's timezone goes here');

// Get user hour
$localtime = localtime(); # Now localtime gives the user's time since timezone has been changed
$userHour = $localtime[2];
$timeAdjustment =  $userHour - $serverHour < -12 ? 24 + $userHour - $serverHour : $userHour - $serverHour; // Calculate hours to add to rows got from db to match user's time

// Example of a row adjusted to match user's time
    $adjustTime =  ($userHour - $serverHour < -12 ? 24 + $userHour - $serverHour : ($userHour - $serverHour > 12 ? $userHour - $serverHour - 24 : $userHour - $serverHour)*60*60; // strtotime is in seconds so $timeAdjustment needs *60*60 to convert to seconds too

我已经在 PHP5+Apache 上对此进行了测试,但结果可能因服务器配置而异。

4

3 回答 3

2

当前用户的时区已使用 date_default_timezone_set() 设置我如何获得它的 GMT +- 时间?

你不能。由于夏令时的变幻莫测,偏移量不是恒定的——它可以根据日期而改变。

使用gmmktime()(连同一些字符串解析)将 GMT 日期/时间转换为 UNIX 时间戳,然后用于date()在当前时区显示该时间戳。

于 2012-11-26T07:03:41.907 回答
1

如果错了,请不要投票:)

如果您在客户端浏览器中获取时区时间并检查差异,如果存在差异,则根据客户端的位置添加或减去此差异值。

于 2012-11-26T06:34:00.327 回答
1

只需将日期值的值作为 UNIX 时间戳传递给 JavaScript。例如,使用 AJAX:

echo json_encode(array(
    'time' => strtotime($row['msg_time']),
    'msg' => 'hello world',
));

然后,使用Date()将其转换为用户的本地时间:

var msgTime = new Date(data.time * 1000);
于 2012-11-26T07:07:44.390 回答