调整时区和夏令时

1 php mysql datetime

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

最好的方法是什么?

Pau*_*her 7

这是一个分步过程.

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

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

  3. 当用户请求页面,加载页面并在需要格式化时间时,使用用户的时区首选项并使用时区感知格式化功能.PHP和Python都有以合理的方式存储日期和时间的方法.

    Haluk有一个很好的例子来说明如何使用PHP的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) ;
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    在Python中,使用pytz库,它也应该已经安装在您的服务器上(同样,假设为*nix).如果不是,请让您的系统管理员安装它(发行版通常会自定义它以使用内置时区数据库),或者只是安装它easy_install.pytz提供了很好的用法示例.你会想要使用这个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'
    
    Run Code Online (Sandbox Code Playgroud)

    每次格式化用户阅读时间时都要这样做.