在我的网站上,用户可以为其当前时区设置首选项。我的数据库中有一堆日期时间,但我希望每次都适当地显示,给定A)他们所处的时区,以及B)夏令时是否有效。
最好的方法是什么?
答案 0 :(得分:7)
这是一个分步过程。
允许用户从Olson timezone database中选择他们的时区。如果您使用的是Linux或其他Unices,它可能已安装在您的计算机上。
将所有日期和时间存储为UTC。没有例外。
当用户请求页面,加载页面并在需要格式化时间时,使用用户的时区首选项并使用时区感知格式化功能。 PHP和Python都有办法以合理的方式存储日期和时间。
Haluk has a good example of how to use PHP's DateTimeZone.但是,如果您正在使用遗留代码,您只在请求中使用一个时区,则可以使用此类内容;这是我在定制PunBB以正确显示时区时所使用的(我已经从那里开始......)
/**
* Sets up the timezone system. $timezone is the timezone. In PunBB, this is
* called by setup_dates($pun_user['timezone']) in common.php.
*
* DON'T USE THIS unless you can't use PHP's DateTime module.
*/
function setup_dates($timezone) {
if(function_exists('date_default_timezone_set')) {
date_default_timezone_set($timezone) ;
} else {
putenv('TZ='.$timezone) ;
}
}
在Python中,使用pytz库,该库也应该已经安装在您的服务器上(同样,假设为* nix)。如果不是,请让您的系统管理员安装它(发行版通常会自定义它以使用内置时区数据库),或者只使用easy_install
安装它。 pytz提供了很棒的usage examples。您需要使用astimezone
方法:
>>> utc_dt = datetime(2002, 10, 27, 6, 0, 0, tzinfo=utc)
>>> loc_dt = utc_dt.astimezone(eastern)
>>> loc_dt.strftime(fmt)
'2002-10-27 01:00:00 EST-0500'
每次格式化用户阅读的时间时都要这样做。
答案 1 :(得分:1)
我们使用日期格式化方法/功能来调整用户的时区。日期/时间存储在我们的本地时区(PST)中并进行适当转换。
我见过其他系统使用unix时间戳存储GMT中的所有内容。您仍然需要将其转换为用户的时区。
答案 2 :(得分:1)
当我查询我的数据时,我使用以下PHP脚本
<? while($row = mysql_fetch_array($registration)){
$dt_obj = new DateTime($row['message_sent_timestamp']." UTC");
$dt_obj->setTimezone(new DateTimeZone('Europe/Istanbul'));
echo $formatted_date_long=date_format($dt_obj, 'Y-m-d H:i:s'); } ?>
您可以将datetimezone值替换为此处可用的php timezones之一:
答案 3 :(得分:0)
MySQL将其本机日期/时间类型作为UTC存储在服务器上,并在每个连接的基础上将它们转换为其他时区。如果连接未指定时区,则会尝试使用服务器时间。您可以阅读有关此in the documentation的更多信息。但你应该能够做到:
SET time_zone = timezone;
在查询开始时到客户端时区,或者如果您按请求连接。