【问题标题】:Adjusting for timezones and DST调整时区和 DST
【发布时间】:2009-05-29 19:23:40
【问题描述】:

在我的网站上,用户可以设置他们当前时区的偏好。我的数据库中有一堆日期时间,但我想适当地显示每个时间,给定 A)它们所在的时区,以及 B)夏令时是否有效。

最好的方法是什么?

【问题讨论】:

    标签: php mysql datetime


    【解决方案1】:

    这是一个多步骤的过程。

    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'
      

      每次格式化时间供用户阅读时执行此操作。

    【讨论】:

    • 我还是有点困惑。我刚刚更改了我的代码以使用 UTC_TIMESTAMP (mysql) 将时间放入数据库中。如何将此时间转换为用户的本地时间?
    • 我所指的步骤是在应用程序级别。使用这些步骤将允许您跟踪用户的时区并允许您进行转换。如果您使用的是 PHP,使用该函数和适当的时区将导致时间字符串格式化函数使用正确的时区,自动补偿 DST。
    【解决方案2】:

    我们使用针对用户时区进行调整的日期格式化方法/功能。日期/时间存储在我们的本地时区 (PST) 中并进行了适当的转换。

    我见过使用 unix 时间戳将所有内容存储在 GMT 中的其他系统。您仍然需要将其转换为用户的时区。

    【讨论】:

      【解决方案3】:

      当我查询我的数据时,我使用以下 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 之一:

      【讨论】:

        【解决方案4】:

        MySQL 将其本地日期/时间类型作为 UTC 存储在服务器上,并在每个连接的基础上将它们转换为其他时区。如果连接没有指定时区,它会尝试使用服务器时间。您可以阅读有关此in the documentation 的更多信息。但你应该能够做到:

        SET time_zone = timezone;

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-17
          • 2019-05-06
          • 2013-03-05
          • 2013-02-21
          • 2021-08-18
          • 2012-07-23
          • 2016-07-29
          • 2019-04-06
          相关资源
          最近更新 更多