【发布时间】:2011-06-02 04:47:54
【问题描述】:
如果我使用 MySQL 中的 NOW() 函数获取当前时间戳,我可以通过 php 获取该字段并在不同时区给出该时间吗?基本上将当前时区的当前时间转换为另一个时区?
【问题讨论】:
标签: php mysql timezone timestamp
如果我使用 MySQL 中的 NOW() 函数获取当前时间戳,我可以通过 php 获取该字段并在不同时区给出该时间吗?基本上将当前时区的当前时间转换为另一个时区?
【问题讨论】:
标签: php mysql timezone timestamp
MySQL 的时区处理比 PHP 的要复杂得多。它处理简单的时区(EST、PST 等)以及我称之为“区域时区”(美国/东部)的内容。即使 DST 规则多年来发生变化,使用区域区域也会使用正确的转换,包括夏令时。
我所做的是使用 MySQL 函数 UTC_TIMESTAMP() 将我所有的日期时间存储为 UTC。然后,在查询中,我使用 MySQL 函数 CONVERT_TZ() 到我的目标时区。 http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html
注意:您可能需要更新您的时区表。 http://dev.mysql.com/downloads/timezones.html
【讨论】:
DateTime 类完全支持时区。 DateTime 时间戳可以设置并交叉转换到任何区域。 MySQL 根本无法在 DATETIME 字段中存储时区信息。尽管如此,CONVERT_TZ 当然是一种有效的方法
您可以使用DateTimeZone 类:
$gmt = new DateTimeZone("GMT");
$datetimeInGMT = new DateTime($now, $gmt);
它还采用continent/city 形式的位置,例如Europe/London.
如果您的日期时间不是 UTC,您可以使用 setTimezone:
$datetimeInGMT = new DateTime($now, new DateTimeZone("America/New_York"));
$datetimeInGMT->setTimezone(new DateTimeZone("GMT"));
【讨论】:
DateTime 的另一个 +1)但不要忘记,要使其正常工作,您需要知道 mySQL 服务器的当前时区才能获取开始日期正确的! MySQL 的时区设置可能与系统的时区不同。
SELECT @@session.time_zone;得到它
date("whatever format",strtotime($timestamp) + $theoffset * 3600) 的操作,其中 $timestamp 是日期,$theoffset 是 $timestamp 的时区与您希望将其更改为的时区之间的差异以小时为单位。