在 PHP 和 MySQL 上处理时区的最佳方法是啥?

Posted

技术标签:

【中文标题】在 PHP 和 MySQL 上处理时区的最佳方法是啥?【英文标题】:What is the best way to handle timezone on PHP & MySQL?在 PHP 和 MySQL 上处理时区的最佳方法是什么? 【发布时间】:2012-08-25 20:52:06 【问题描述】:

我目前正在研究在我的网站上处理时区的最佳方法。来自许多不同国家的人会同时访问它,我必须向他们展示基于时间的信息,所以我想:

根据我的服务器将每次存储在数据库中(相同的时区,由 php 定义) 然后,用户可以选择自己的时区,我使用 mysql 函数 DATEADD 进行所需的转换。

这似乎工作正常,但我的问题是:

这是最好的方法吗? DATEADD 是处理小时差的最有效函数吗?

谢谢。

【问题讨论】:

你检查了吗***.com/questions/518296/… 【参考方案1】:

如MySQL Server Time Zone Support中所述:

当前会话时区设置会影响区域敏感时间值的显示和存储。这包括NOW()CURTIME() 等函数显示的值,以及在TIMESTAMP 列中存储和检索的值。 TIMESTAMP 列的值从当前时区转换为 UTC 以进行存储,并从 UTC 转换为当前时区以进行检索。

因此,如果您使用TIMESTAMP 类型的列,MySQL 将自动为您处理时区转换:只需在其time_zone 变量中为会话设置适当的时区。

【讨论】:

假设我使用 NOW() 插入用户数据。它会存储在他的时区吗?如果没有,似乎是最好的方法。 @RenatoSiqueiraMassaro:如果您将 NOW() 存储到 TIMESTAMP 列中,那么 MySQL 将在 UTC 中保存当前时间。当您随后检索该列的值时,它将转换为当前会话的时区。例如,如果我的会话在UTC+05:00 中,而现在的时间是我本地时区的09:30,则将存储04:30,并在我获取数据时检索09:30 谢谢。这正是我所需要的,而且看起来很简单。 只需在其 time_zone 变量中为会话设置适当的时区。如何在 php @eggyal 中执行此操作 @Kannu:以正常方式发出SET time_zone = ... 查询。【参考方案2】:

你的想法是正确的。

我不会使用服务器的时区。而是使用协调世界时 (UTC) 时间。它是世界时间标准。这与格林威治标准时间 (GMT) 几乎相同。请注意,UTC 不会随着夏令时而改变。

要在 PHP 中使用,请参阅:http://php.net/manual/en/function.gmdate.php

从这里,您可以通过以下方式添加营业时间:http://www.php.net/manual/en/datetime.add.php

或者根据用户偏好设置时区:http://www.php.net/manual/en/datetime.settimezone.php

您使用的是基于您获取用户时区的方式。如果您要求他们(最准确),您可以在 PHP 中设置时区,用户从组合框中进行选择。如果您使用 getTimezoneOffset(); 从带有 javascript 的标头中获取它,那么最好根据时区偏移量添加小时数。

【讨论】:

【参考方案3】:

我个人根据 GMT +0.00 时区在我的数据库中设置所有时间。例如,当我想添加当前时间时,我使用UTC_TIMESTAMP()(或UTC_DATE()UTC_TIME() - 以适用者为准)。这是独立于服务器的,所以我相信即使我改变了我的服务器,我以后也不必担心这个问题。

然后选项是,如果您的访问者有机会选择他们自己的时区,您可以在提供结果之前使用DATE_ADD()DATE_SUB() 函数来格式化结果。

否则,如果您有机会(这是我最喜欢的解决方案),您可以使用 Javascript 来格式化该日期/时间,您可以通过类似

的方式轻松处理它
function getLocalDate(dt) 
    var d = new Date(0);
    d.setUTCSeconds(dt);
    return d.toLocaleDateString();
    // or in some format that you choose

获取 PHP 使用 strtotime($row['some_date']); 回显的日期。

【讨论】:

为什么不使用TIMESTAMP,让 MySQL 为你做这一切?

以上是关于在 PHP 和 MySQL 上处理时区的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不同的时区处理MYSQL NOW()?

在非 Windows 机器上使用 php 处理所有版本的 MS Excel 电子表格的最佳方法是啥

PHP、MySQL 和时区

将日期和时间存储在 MySQL 数据库中以便以后使用 PHP 显示的最佳方法是啥?

为多个主机上的 PHP 站点处理会话的最佳方法是啥? [关闭]

在 PHP 中保持 MySQL 凭据私有的最佳方法是啥?