【问题标题】:understanding results of global.time_zone了解 global.time_zone 的结果
【发布时间】:2009-01-31 22:22:49
【问题描述】:

我正在研究更改数据库时区的方法,因为我的用户群位于英国,但我的域位于美国。我研究了许多选项,包括 php、PEAR 时间类和 MySQL 函数。对我来说最简单的(主要是因为它以 MySQL 开头和结尾)涉及更改 MySQL 的 time_zone 参数。

在准备这样做时,我刚刚尝试了 MySQL 的 @@global.time_zone 调用(在我开始使用它之前我最好理解这一点)。它产生了一大堆我没想到的参数,而 MySQL 的站点 (link text) 没有提到 - 它显然是一个数组,它返回许多可识别的参数,如登录协议等,但我看不到任何参数明显的参数返回与时区有关的任何内容。

你有这方面的经验吗?你能建议吗? 非常感谢。

【问题讨论】:

    标签: mysql timezone


    【解决方案1】:

    处理时区有两个关键:

    1. 将所有日期/时间存储在同一时区(可以是任何时区,但使用 UTC 确实可以简化事情。)

    2. 决定在您的应用程序中,日期/时间将转换为/从存储时区转换为用户显示时区。这可以在数据库抽象层、应用程序代码或页面模板(基本上是 MVC 堆栈的任何部分)中完成。重要的是要保持一致。

    还请记住,php 有自己的独立于 MySQL 的时区设置。如果您正在运行 php >5.1,则可以在运行时使用 date_set_default_timezone() 更改 php 时区。

    如果您决定在数据库中检索/存储信息时进行时区转换,MySQL 的 convert_tz() 函数将成为您最好的新朋友。

    对我来说,将时区转换作为页面模板的一部分是最简单的。日期/时间以 UTC 时区存储在数据库中,所有应用程序逻辑也以 UTC 格式保存。在 HTML 中输出日期时,我使用 php 的 date() 的包装函数来输出用户时区中的日期:

    function getTimezoneOffset($time, $timezone)
    {       
        $t = new DateTime(date('Y-m-d H:i:s', $time));  
        $tz = new DateTimeZone($timezone);  
        $t->setTimeZone($tz);   
        return $t->getOffset();
    }
    function myDate($timezone, $format, $timestamp=false)
    {
        if (!$timestamp) $timestamp = time();
        return date($format, $timestamp+getTimezoneOffset($timestamp, $timezone));
    }
    

    同样,当通过表单获取用户输入时,首先进行时区转换,以便您的应用程序可以使用 UTC 日期/时间。

    另一种选择是使用 PostgreSQL——与 MySQL 不同的是,它内置了对日期时间的时区支持。

    【讨论】:

      【解决方案2】:

      标准做法是存储您希望以 UTC(即 GMT)显示的任何日期/时间,然后使用 javascript 自动从用户的客户端获取时区,或者询问用户他住在哪里。

      就我个人而言,我不认可自动方法,因为许多用户没有设置正确的时区。但是向他们建议默认设置会很有用。

      无论哪种方式,一旦您有了用户的时区,只需将其添加到数据库中存储的 UTC 时间戳中,然后再显示即可。

      【讨论】:

        猜你喜欢
        • 2020-05-07
        • 2012-01-25
        • 2011-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-10
        • 1970-01-01
        相关资源
        最近更新 更多