【发布时间】:2009-05-29 19:23:40
【问题描述】:
在我的网站上,用户可以设置他们当前时区的偏好。我的数据库中有一堆日期时间,但我想适当地显示每个时间,给定 A)它们所在的时区,以及 B)夏令时是否有效。
最好的方法是什么?
【问题讨论】:
在我的网站上,用户可以设置他们当前时区的偏好。我的数据库中有一堆日期时间,但我想适当地显示每个时间,给定 A)它们所在的时区,以及 B)夏令时是否有效。
最好的方法是什么?
【问题讨论】:
这是一个多步骤的过程。
允许用户从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'
每次格式化时间供用户阅读时执行此操作。
【讨论】:
我们使用针对用户时区进行调整的日期格式化方法/功能。日期/时间存储在我们的本地时区 (PST) 中并进行了适当的转换。
我见过使用 unix 时间戳将所有内容存储在 GMT 中的其他系统。您仍然需要将其转换为用户的时区。
【讨论】:
当我查询我的数据时,我使用以下 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 之一:
【讨论】:
MySQL 将其本地日期/时间类型作为 UTC 存储在服务器上,并在每个连接的基础上将它们转换为其他时区。如果连接没有指定时区,它会尝试使用服务器时间。您可以阅读有关此in the documentation 的更多信息。但你应该能够做到:
SET time_zone = timezone;
到查询开始时的客户端时区,或者如果您按请求连接。
【讨论】: