所以我有一个带注释功能的站点,其中注释的时间戳存储在MySQL数据库中。据我所知,时间戳在存储时转换为UTC,然后在检索时转换回默认时区。在我的情况下,我的服务器处于中央夏令时时区(CDT)。
我计划通过报名表从每个用户获取时区。我只是想知道如何将TIMESTAMP值转换为用户的时区。
$userTimezone = new DateTimeZone($userSubmittedTimezoneString); $myDateTime = new DateTime($storedTimestamp, $userTimezone);
......还是不正确?
答案 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标头中发送。你能做的最好的是:
答案 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
解释说:
Date().getTimezoneOffset()
会在几分钟内将偏移返回到GMT-0 getTimezoneOffset()
会将偏移返回到GMT-0 ,而不是从GMT-0 ,我们需要将其转过来。怎么样?很简单,只要知道-*-=+
&amp; -*+=-
。如果您了解基础数学,那么您已经了解这一原则。getTimezoneOffset()
将以分钟为单位返回偏移量,因此我们将其除以60,这样我们就可以得到gmt偏移格式。 结果: (-(new Date().getTimezoneOffset()))/60
现在在PHP中检索cookie:
<?php
$user_timezone = $_COOKIE['utimezone'];
?>