在 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 上处理时区的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
在非 Windows 机器上使用 php 处理所有版本的 MS Excel 电子表格的最佳方法是啥
将日期和时间存储在 MySQL 数据库中以便以后使用 PHP 显示的最佳方法是啥?