PHP 和 MySQL 时区,同时支持用户定义的时区

标签 php mysql sql timezone unix-timestamp

我正在做一些事情,用户可以选择他们自己的时区,软件也可以被其他人在他们的网站上使用,但我想确保数据库中的时区总是设置为 UTC

现在我知道如何设置PHP的默认时区了,比如:

date_default_timezone_set('Australia/Sydney');

...但我不确定如何确保 MySQL 使用 UTC? ...甚至一旦您确定它使用的是 UTC,我想您必须先将 PHP 日期/时间转换为 UTC,然后再将其传递给数据库?

我想我想知道许多不同的日期格式,例如 TIMESTAMPDATETIME 甚至 UNIX EPOCH 整数时间戳,它们可以简单地存储为 int 例如数据类型。

然后是从数据库中检索日期/时间并将其转换为相应时区的整个过程,最后,DST 是如何进入所有这些过程的?

我知道那里有很多类似的问题,但我想没有一个能真正回答我所有的问题。

最佳答案

MySQL 的数据类型timestampUTC 格式存储日期。为了使其正常工作,MySQL 使用服务器的时区并进行日期转换。它将日期从服务器的当前时区转换为 UTC 进行存储。这意味着数据库服务器永远不应更改其时区以使此功能正常工作。

当您将数据发送到此类数据库时,您也会发送 UTC 时间。最简单的方法是根据 MySQL 的要求 (m-d-Y H:i:s) 格式化 time() 的结果。

在 PHP 中,当您格式化日期以插入 MySQL 时,最好使用 DateTime 类。它允许您使用时区信息偏移日期,这意味着您不必使用可能导致错误的 date_default_timezone_set 函数。

一个 DateTime 的例子:

$date = '1.12.2015 13:37:37'; // Format is day.month.year hour:minute:second

// We create DateTime from custom date format, for the person who resides in Australia/Sydney time zone
$dt = DateTime::createFromFormat('d.m.Y H:i:s', $date, new DateTimeZone('Australia/Sydney'); 

// Now we change the date's time zone into UTC, and we can insert it into MySQL
$dt->setTimeZone(new DateTimeZone('UTC'));

// This is the formatted date-string that can be safely inserted into MySQL
$date_string_for_mysql = $dt->format('m-d-Y H:i:s');

或者,您可以在 MySQL 中使用 int 类型来存储时间戳并插入 time() 的结果,但这有一个很大的缺点,那就是不能使用 date-相关功能。

关于PHP 和 MySQL 时区,同时支持用户定义的时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32267157/

相关文章:

php - 刷新页面之前等待 UPDATE 完成

php - Laravel latin5_turkish_ci 排序规则问题

php - 如何使用 importcsv 插件读取 CSV 文件数据

php - 无法使用 "execute()"执行我的 PDO 查询,出现 "bindParam()"错误

mysql - 带外键的sql循环

php - 对象关系映射 : What's the best way to implement getters?

php - 如何根据另一个组合框集合的选定项目来过滤一个组合框集合?

MySQL - SELECT 语句超出 VARCHAR 长度

mysql - 单个查询中来自多个碱基的计数

sql - 数据库 'master' 中的 CREATE DATABASE 权限被拒绝。 MVC EF 4.1 Codefirst 入门