PHP/MySQL时间戳和时区

4

如果我使用MySQL的NOW()函数获取当前时间戳,那么我可以通过php获取该字段并将该时间转换为不同的时区吗?基本上是将当前时区的当前时间转换为另一个时区吗?

2个回答

5
你可以使用 DateTimeZone 类:
$gmt = new DateTimeZone("GMT");
$datetimeInGMT = new DateTime($now, $gmt);

这里的位置格式为大陆/城市,例如欧洲/伦敦

如果你的日期时间不是UTC时区,你可以使用setTimezone函数:

$datetimeInGMT = new DateTime($now, new DateTimeZone("America/New_York"));
$datetimeInGMT->setTimezone(new DateTimeZone("GMT"));

没错,但是如果我的时间戳已经是另一个时区的了怎么办?我能把它转换成另一个时区吗? - John
+1(如果可以的话,还有一个+1是给DateTime的)但别忘了为了让这个工作正常,你需要知道MySQL服务器当前所在的时区以便获取正确的开始日期!MySQL的时区设置可能与系统时区不同。 - Pekka
@Pekka,您可以使用 SELECT @@session.time_zone; 来获取它。 - moinudin
另外,如果您不想使用DateTime类(没有任何理由,只是说一下),并且您有一个有效的时间戳或日期(例如下午5:00,2011年1月1日或2011-01-01 20:00:00),您可以执行类似于date("任何格式",strtotime($timestamp) + $theoffset * 3600)的操作,其中$timestamp是日期,$theoffset是$timestamp时区与您要更改为的时区之间的差异(以小时为单位)。 - Phoenix

3
MySQL的时区处理比PHP要复杂得多。它处理简单时区(如EST、PST等)和我所谓的“地区时区”(如America/Eastern)。使用地区时区会进行正确的转换,包括夏令时,即使夏令时规则在多年间发生了变化。
我的做法是使用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

1
自 PHP 5 以来,PHP 成为这两个编程语言中更为复杂的一种:DateTime 类完全支持时区。一个 DateTime 时间戳可以被设定并可在不同时区之间进行转换。而 MySQL 在 DATETIME 字段中无法存储时区信息。尽管如此,CONVERT_TZ 仍然是一种有效的方法。 - Pekka
不一定有效。阅读Aaron对这个问题的回答https://dev59.com/vHI-5IYBdhLWcg3w18V3 - Michał Klimczak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接