我正在尝试将用户的本地时间存储到我的数据库中。我不能使用PHP函数now()
,因为它返回服务器的时间。
我使用JavaScript获得了TimezoneOffset
:
d = new Date();
alert(d.getTimezoneOffset()/60);
如何使用此计算时间?我应该将哪种类型用于MySQL数据类型?
由于
答案 0 :(得分:3)
我必须建议以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
Whoops ... date()是当前的语言环境感知。应该使用gmdate()代替。
当然,有一种完全不同的方法可能更好: 存储用户时区的文本表示,该时区与PHP的date_default_timezone_set()兼容。然后,在每个请求中,如果您有经过身份验证的用户,则可以设置时区,并且所有日期函数都将遵循它。
答案 1 :(得分:1)
首先将表中的d.getTimeZoneOffset()(不分割)的值存储为INT。
然后,在获取时区时,请运行:
SELECT `time` AS original_time, DATE_ADD(original_time, INTERVAL `usersettings`.`timezoneoffset` MINUTES) AS new_time FROM `times`
(注意:这是未经测试的!)
答案 2 :(得分:0)
为什么不现在使用PHP()并在向用户显示时间时将其转换。这样你所有的存储时间都是标准的,你不必为了向其他用户显示相同的时间而做任何诡计。
我发现这个方便的代码片段用于在服务器时间之间进行转换和用户时间。如果您要将本地用户和服务器设置并存储在本地,您可以轻松地将其设置为动态的“一刀切”方法。
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);