所以我有一个带有评论功能的网站,其中评论的时间戳存储在MySQL数据库中。据我了解,时间戳在存储时会转换为 UTC,然后在检索时转换回默认时区。就我而言,我的服务器位于中部夏令时时区 (CDT)。
我有一个计划通过输入表单从每个用户那里获取时区。我只是想知道如何将 TIMESTAMP 值转换为用户的时区。
- 首先,我会从 UTC 转换为本地时区吗?还是CDT到本地时区?
- 其次,我将如何在PHP中做到这一点?我会做:
$userTimezone = 新的日期时区($userSubmittedTimezoneString);$myDateTime = 新的日期时间($storedTimestamp、$userTimezone);
。还是不正确?
日期/时间/日期时间值在您提供它们时存储在 MySQL 中。 即,如果您将字符串2012-04-17 12:03:23
INSERT
到DATETIME
列中,那就是将存储的值。它将在内部转换为时间戳,该时间戳可能准确,也可能不准确(见下文),但是当您再次查询该值时,您将获得相同的值;往返是透明的。
如果您尝试在 SQL 中执行时间计算,则可能会出现问题,即任何需要 SQL 考虑时区和/或服务器时间的操作。例如,使用 NOW()
.对于任何这些操作,应正确设置时区和/或服务器时间。请参阅时区问题。
如果这与你无关,你只需要在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');
没有可靠的方法来获取用户的时区。时区信息不会在 HTTP 标头中发送。您能做的最好的事情是:
- 将 IP 地址与地理数据库进行匹配-或-
- 使用 Javascript 获取用户计算机上设置的时间,并将其发送到服务器 (AJAX) 或在客户端上创建时间字符串。
$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()
对象。
的方法是使用 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,因此我们需要将其扭转过来。如何?很简单,只要知道-*-=+
和-*+=-
。如果你懂基本的数学,你就已经知道这个原理了。 - 正如我在步骤 1 中所说,
getTimezoneOffset()
将以分钟为单位返回偏移量,因此我们只需将其除以 60,因此我们可以获得 gmt 偏移量格式。
结果:(-(new Date().getTimezoneOffset()))/60
现在在 PHP 中检索 cookie:
<?php
$user_timezone = $_COOKIE['utimezone'];
?>