3

我有一个 PHP MySQL 查询,它将一些数据插入到 MySQL 数据库中,它包含一个时间戳。

当前INSERT查询NOW()用于时间戳列,并以以下格式保存在数据库中:2012-07-24 13:13:02

不幸的是,服务器不在我的时区,它被列为 America/Los_Angeles,如图所示print date_default_timezone_get();

我希望做到以下几点:

date_default_timezone_set('Europe/London');
$timefordbLondonEU = date('Y-m-d H:i:s', time());

并简单地将;保存到数据库$timefordbLondonEUNOW()

这是保存此类数据的好方法吗?

非常感谢,

理查德

[添加文字]

我将 MySQL 数据库中的类型更改为DateTime并执行了以下操作:

date_default_timezone_set('Europe/London');
$timefordbLondonEU = date('Y-m-d H:i:s', time()); 

它正在工作,但我仍然没有得到整体概念。

Assumptions based on your comments:
  1. MySQL = 没有数据类型 UTC,您只需使用 INT 类型。
  2. Unix_TimeStamp() 会保存当前时间还是计数?UTC 格式,例如 1343247227。
  3. 由于 UTC 是从一个常见的 0 点开始计算的,因此您可以从中获取任何时区。假设您不想要 1970 年参考 0 点之前的日期。

我的猜测和你所说的引导是最好的方法是将时间保存为 INT(1343247227)中的 UTC,然后从那里生成你想要的任何时区。再次假设您不需要在 1970 年参考 0 点之前存储日期。

同样,为什么不在已知时区存储为日期时间 YYYY-MM-DD HH:MM:SS,然后转换为 UTC 或其他时区。这一切似乎都很混乱=(

4

1 回答 1

7

正如@Petah 在评论中所说,将您的时间存储在 UTC 中,并根据需要将它们隐藏在应用程序中。

Unix 时间戳采用 UTC,所以我通常将我的时间作为时间戳存储在数据库中。这避免了在选择时首先转换为 UTC 以插入,然后从 UTC 转换的头痛和困惑。

也就是说,将你的时间字段设为一个INT类型,并UNIX_TIMESTAMP()在插入时使用 MySQL 中的函数,或者使用该函数从 PHP 中获取时间戳time()

当您从数据库中获取时间戳时,它将采用 UTC,但是当您使用 将其显示在 PHP 应用程序中date()时,它将显示在服务器时区或您设置的任何时间date_default_timezone_set

因此,以下两个查询将起作用:

INSERT INTO `table` (id, time) VALUES(NULL, UNIX_TIMESTAMP());

// or

$time = time();

$query = "INSERT INTO `table` (id, time) VALUES(NULL, $time);

如果你想从数据库中选择它作为一个DATETIME,你可以这样做:

SELECT *, FROM_UNIXTIME(time) as dt FROM `table` WHERE 1

结果dt列的格式为yyyy-MM-dd hh:mm:ss.

您可以使用 PHP 格式化数字时间戳date()

如果您拥有的 PHP 版本是 64 位的,则不限于 1970 - 2036 年的范围,PHP 将支持 64 位时间戳,BIGINT在这种情况下请确保使用 MySQL 中的列。

希望有帮助。

于 2012-07-25T22:45:55.420 回答