我的服务器在达拉斯。我在纽约市.. PHP 和 MySQL 都有用于设置时区的配置变量。
我如何让他们一起工作?我应该在 MySQL 中存储哪些日期?如何让 PHP 根据用户的偏好来处理更改日期?
请记住:我认为我从来没有让 PHP 明确设置日期,它总是在查询中使用“NOW()”。但是我预见到有必要这样做。这将如何完成?
我希望SO的经验可以帮助我。
到处使用 Unix 时间。它使用 UTC,因此每个时区都相同。日期方法通常使用它们拥有的时区信息转换为它并从它返回,因此您将拥有一个正确的时间。
或者,您可以仅使用 Unix Time 将时间从一台计算机传输到另一台计算机(例如从 DB 到运行 PHP 的服务器或 JavaScript 客户端)。每种语言都有可以转换成它和从它转换成它的功能。对于 MySQL,它是:
UNIX_TIMESTAMP(date)
FROM_UNIXTIME(unix_timestamp)
这样,您可以在数据库和日志中正确格式化您的时间,但在任何地方仍然有正确的本地时间。
对于环境,我更喜欢使用原生形式的日期和时间,即 PHP 中的 Unix 时间戳和 MySQL 中的 DATE/TIME/DATETIME/TIMESTAMP 字段。FROM_UNIXTIME()
我使用and将这两个值转换为另一个值UNIX_TIMESTAMP()
。我更喜欢这个而不是 Unix 时间戳,因为本地日期/时间更容易阅读。
在 GMT 中记录您的日期(零偏移),然后根据当地时区计算偏移(例如,EST 为 +6,因此您将在 GMT 上增加 6 小时)。
检查该功能的日期文档date_default_timezone_set()
。
请记住,在写入数据库时,您必须更改时区,存储日期,然后再更改回来。同样,当您检索日期时,不要忘记添加时区偏移量。
mysql-server 以独立于时区的格式 (UTC) 存储日期。
但在存储日期之前,它将使用其时区进行转换。
您可以更改每个连接的 mysql 时区 *1:
mysql_query('SET time_zone = "'.$timezone.'"');
您还可以更改每个脚本的时区。
date_default_timezone_set($timezone);
如果将它们设置为相同的时区“2009-01-10 13:30:00”对 mysql 和 php 意味着相同的事情。
但请记住,两台服务器具有不同的内部时钟值,因此如果您想根据当前时间生成时间戳。在 mysql 或 php 中执行此操作。
*1) MySQL 时区支持可能需要额外的配置。检查手册