PHP& MySQL:将存储的TIMESTAMP转换为用户的本地时区

时间:2012-04-17 02:12:37

标签: php mysql datetime timezone timezone-offset

所以我有一个带注释功能的站点,其中注释的时间戳存储在MySQL数据库中。据我所知,时间戳在存储时转换为UTC,然后在检索时转换回默认时区。在我的情况下,我的服务器处于中央夏令时时区(CDT)。

我计划通过报名表从每个用户获取时区。我只是想知道如何将TIMESTAMP值转换为用户的时区。

  • 首先,我会将UTC转换为本地时区吗?或CDT到当地时区?
  • 其次,我将如何在PHP中执行此操作?我会这么做:
$userTimezone = new DateTimeZone($userSubmittedTimezoneString);
$myDateTime = new DateTime($storedTimestamp, $userTimezone);

......还是不正确?

4 个答案:

答案 0 :(得分:20)

日期/时间/日期时间值在您提供时存储在MySQL中。即如果您将INSERT字符串2012-04-17 12:03:23放入DATETIME列,那就是将要存储的值。它将在内部转换为时间戳,该时间戳可能准确也可能不准确(见下文),但是当您再次查询该值时,您将获得相同的值;往返是透明的。

如果您尝试在SQL中进行时间计算,则可能会出现问题。即任何需要SQL来考虑时区和/或服务器时间的操作。例如,使用NOW()。对于任何这些操作,的时区和/或服务器时间应正确设置。请参阅Time Zone Problems

如果这与您没关系,您只需要在PHP中进行计算,您只需要确保知道要转换到哪个时区的时区。为此目的,可以方便地将所有时间标准化为UTC,但是没有必要,因为从任何时区到任何其他时区的时区转换同样适用,只要您清楚您要转换的时区。

date_default_timezone_set('Asia/Tokyo'); // your reference timezone here

$date = date('Y-m-d H:i:s');

/* INSERT $date INTO database */;

$date = /* SELECT date FROM database */;

$usersTimezone = new DateTimeZone('America/Vancouver');
$l10nDate = new DateTime($date);
$l10nDate->setTimeZone($usersTimezone);
echo $l10nDate->format('Y-m-d H:i:s');

答案 1 :(得分:1)

没有可靠的方法来获取用户的时区。时区信息不会在HTTP标头中发送。你能做的最好的是:

  1. 将IP地址与地理数据库匹配 -OR -
  2. 使用Javascript在用户的计算机上设置时间,然后将其发送到服务器(AJAX)或在客户端上设置时间字符串。

答案 2 :(得分:0)

$timezone = new DateTimeZone('America/Vancouver');

$date = new DateTime(date('m/d/Y h:i:s a', time()));
$date->setTimeZone($timezone);
echo $date->format('l F j Y g:i:s A')."\n";

new DateTime(date('m/d/Y h:i:s a', time()));替换为new DateTime("UTC Time");

您可以为每个用户输入创建一个新的DateTimeZone()对象。

答案 3 :(得分:0)

这样做的方法是使用javascript。我认为最好的方法是将用户GMT存储到他的cookie中,然后在PHP流程表中检索它。

<script language="javascript">

function TimeZoneCookie()
{
 var u_gmt = (-(new Date().getTimezoneOffset()))/60;
 var o_date = new Date("December 31, 2025");
 var v_cookie_date = o_date.toGMTString();
 var str_cookie = "utimezone="+u_gmt;
 str_cookie += ";expires=" + v_cookie_date;
 document.cookie=str_cookie;
}
//---------------------
TimeZoneCookie();

</script>

u_gmt解释说:

  1. Date().getTimezoneOffset()会在几分钟内将偏移返回到GMT-0
  2. 由于getTimezoneOffset()会将偏移返回到GMT-0 ,而不是从GMT-0 ,我们需要将其转过来。怎么样?很简单,只要知道-*-=+&amp; -*+=-。如果您了解基础数学,那么您已经了解这一原则。
  3. 正如我在中所说的那样,步骤1 getTimezoneOffset()将以分钟为单位返回偏移量,因此我们将其除以60,这样我们就可以得到gmt偏移格式。
  4. 结果: (-(new Date().getTimezoneOffset()))/60


    现在在PHP中检索cookie:

    <?php
    
    $user_timezone = $_COOKIE['utimezone'];
    
    ?>