我正在尝试将用户的本地时间存储到我的数据库中。我不能使用 PHP 函数now()
,因为它返回服务器的时间。
我TimezoneOffset
通过使用 JavaScript 得到了:
d = new Date();
alert(d.getTimezoneOffset()/60);
我怎样才能用这个来计算时间?我应该为 MySQL 数据类型使用什么类型?
谢谢
我正在尝试将用户的本地时间存储到我的数据库中。我不能使用 PHP 函数now()
,因为它返回服务器的时间。
我TimezoneOffset
通过使用 JavaScript 得到了:
d = new Date();
alert(d.getTimezoneOffset()/60);
我怎样才能用这个来计算时间?我应该为 MySQL 数据类型使用什么类型?
谢谢
我不得不建议将您所有的时间都存储在 UTC 中,然后还要存储用户的时区偏移量。这允许最大的灵活性,以及实际数据(UTC 时间)和显示逻辑(UTC +/- 偏移量)之间的适当分离。
对于存储,无论我尝试 RDBMS 特定时间字段多少次,int 字段中的 unix 时间戳始终提供最佳的灵活性和可移植性。
您可以以秒为单位存储用户的时区偏移量,以使过程更加简单。所以 EST (-5) 将变为 -18 000
然后,为了显示时间 -/+ 用户的偏移量,简单的第二次数学运算就可以了:
$now = time();
$userTime = $now + $user->getTimezoneOffset();
这会很好,因为添加一个负数就像减去一个正数一样。
编辑:
您将能够使用 PHP 的标准gmdate()函数格式化用户的时间戳。只需将计算出的时间戳作为函数的第二个参数传递。见http://ca2.php.net/manual/en/function.gmdate.php
哎呀... date() 是当前语言环境感知的。应该使用 gmdate() 代替。
当然,有一种完全不同的方法可能更好:存储与 PHP 的 date_default_timezone_set() 兼容的用户时区的文本表示。然后,在每个请求中,如果您有一个经过身份验证的用户,您可以设置时区,所有日期函数都将遵循它。
首先将 d.getTimeZoneOffset() 的值(不除)作为 INT 存储在表中。
然后,在获取时区时,运行:
SELECT `time` AS original_time, DATE_ADD(original_time, INTERVAL `usersettings`.`timezoneoffset` MINUTES) AS new_time FROM `times`
(注意:这是未经测试的!)
为什么不使用 PHPs now() 并在向用户显示时间时将其转换。这样一来,您存储的所有时间都是标准的,您无需采取任何技巧来向其他用户显示相同的时间。
我发现了这个方便的小代码片段,用于在您的服务器时间和用户时间之间进行转换。如果您要在本地设置和存储用户并且在本地存储您的服务器,您可以轻松地使其成为一种动态的一刀切的方法。
http://www.tek-tips.com/viewthread.cfm?qid=1444820&page=1
//set local timezone
date_default_timezone_set("Europe/Paris");
//get server time as a unix timestamp
$unixtime = strtotime($servertime . ' EST'); //append EST to denote New York time
//convert to human readable local time
echo 'server time is '.date('r', $unixtime);