调整时区和夏令时

时间:2009-05-29 19:23:41

标签: php mysql datetime

在我的网站上,用户可以为其当前时区设置首选项。我的数据库中有一堆日期时间,但我希望每次都适当地显示,给定A)他们所处的时区,以及B)夏令时是否有效。

最好的方法是什么?

4 个答案:

答案 0 :(得分:7)

这是一个分步过程。

  1. 允许用户从Olson timezone database中选择他们的时区。如果您使用的是Linux或其他Unices,它可能已安装在您的计算机上。

  2. 所有日期和时间存储为UTC。没有例外。

  3. 当用户请求页面,加载页面并在需要格式化时间时,使用用户的时区首选项并使用时区感知格式化功能。 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;

在查询开始时到客户端时区,或者如果您按请求连接。