【问题标题】:php timestamp utcphp时间戳UTC
【发布时间】:2012-07-24 11:24:01
【问题描述】:

我有一个 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());

只需将$timefordbLondonEU 代替NOW() 保存到数据库中;

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

非常感谢,

理查德

[添加文本]

我将 MySQL db 中的 Type 更改为 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 或其他时区。这一切似乎都很混乱=(

【问题讨论】:

  • 将所有时间存储为 UTC,然后在输出时将其转换为您想要的时间。
  • 或者,如果您不需要存储 1970 年之前的日期,您可以将它们存储为 Unix 时间戳,方法是将字段设为 INT

标签: php mysql datetime timestamp


【解决方案1】:

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

Unix 时间戳采用 UTC,所以我通常将我的时间作为时间戳存储在数据库中。这样就省去了先转换为 UTC 插入,然后在选择时从 UTC 转换的麻烦和困惑。

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

当您从数据库中获取时间戳时,它将采用 UTC,但是当您使用 date() 在 PHP 应用程序中显示它时,它将显示在服务器时区,或​​者您使用 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 位时间戳,在这种情况下,请确保在 MySQL 中使用 BIGINT 列。

希望对您有所帮助。

【讨论】:

  • 好吧,这可能让我更困惑了......但我将 MySQL 中的 Type 更改为 DateTime 并执行了以下操作: date_default_timezone_set('Europe/London'); $timefordbLondonEU = date('Y-m-d H:i:s', time());它的工作,但我仍然没有真正得到这个。假设:MySQL = 没有 UTC 数据类型,因此您使用 INT 类型。 Unix_TimeStamp() 会保存当前时间还是计数?采用 UTC 格式,例如 1343247227。由于 UTC 是从一个常见的 0 点开始计算,您可以从中获取任何时区吗?
  • MySQL DATETIME 列只是YYYY-MM-DD HH:MM:SS 格式的列,时区无关紧要。它可以是 UTC 或任何其他时区。 Unix 时间戳(在 MySQL 中存储为 INT 或 BIGINT)是整数,并且始终采用 UTC。它们是自世界标准时间 1970 年 1 月 1 日午夜以来经过的秒数。因为它们始终是 UTC,所以很容易转换到给定的时区/从给定的时区转换。 MySQL 中的 UNIX_TIMESTAMP() 以 UTC 格式保存当前时间戳。这是否消除了任何混乱或使情况变得更糟?
  • 是的,它正在到达那里 =D 我想唯一的问题是选择您想要的时区并从那里开始。如果您选择一个时区并将其用作 DateTime 格式的参考,那么您似乎不再是 UTC 的真正粉丝,您可以在没有 1970 年限制的情况下进行任何您需要的时区转换或日期更改,如果您需要它。我猜如果需要,您始终可以将时区设置为 UTC。仅使用 datetime 有什么缺点吗?再次感谢您的帮助!
  • 时间戳的好处是您可以从数据库中获取它们,并将它们与 PHP 日期函数一起使用,时区转换为服务器时间是自动的。在非 UTC 中存储为 DateTime 需要一个额外的步骤,将其从存储的时区转移到用户或服务器时区,或​​者转换为 UTC 以使用 w/PHP 日期函数。使用 64 位 PHP,无需担心 1970 年的限制,您可以为 1970 年之前的日期设置负时间戳,截止年份为 292,277,026,596,因此这不成问题。由于时间戳为 UTC,因此以 UTC 存储非常普遍。
猜你喜欢
  • 1970-01-01
  • 2019-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
  • 2011-09-01
相关资源
最近更新 更多