9

我有一个用户可以发表评论的博客。我插入他们发表评论的时间NOW(),然后使用date('j M Y', stored timestamp)来显示他们发表评论的时间。

我想知道 NOW() 是否返回locatime of the end user or the localtime at my server. UNIX_TIMESTAMP它是否比NOW()计算用户发表评论的本地时间更适合使用。

4

3 回答 3

7

该函数NOW()生成一个格式化的日期时间字符串,由 MySQL 服务器的时区决定。

但是,最好使用UNIX_TIMESTAMP()GMT 来存储时间。这样做可以更轻松地根据访问者所在的国家/地区对其进行格式化(例如,使用 JavaScript)。

如果您仍想使用DATETIME列,则可以使用存储时间UTC_TIMESTAMP()(它格式化日期,NOW()但以 UTC 表示);它应该在所有其他方面或多或少地工作相同。

于 2013-02-13T09:12:41.330 回答
7

UNIX_TIMESTAMP()如果没有传递参数,MySQL会返回自 '1970-01-01 00:00:00' UTC 以来的 Unix 时间戳(以秒为单位)作为无符号整数UNIT_TIMESTAMP().

当此函数与日期参数一起使用时,它将参数的值作为自 '1970-01-01 00:00:00' UTC 以来的秒数返回为无符号整数。

参数可以是 DATE、DATETIME、TIMESTAMP 或 YYYYMMDD 或 YYMMDD 中的数字。

注意:由于UNIX_TIMESTAMP()适用于当前日期时间,因此您的输出可能与显示的输出不同。

NOW()返回当前日期和时间。

SELECT NOW(), UNIX_TIMESTAMP(NOW());
+---------------------+-----------------------+
| NOW()               | UNIX_TIMESTAMP(NOW()) |
+---------------------+-----------------------+
| 2011-10-03 10:22:37 |            1317666157 |
+---------------------+-----------------------+
于 2013-02-13T10:31:29.807 回答
3

让我们看看手册对NOW()有什么看法:

返回当前日期和时间作为 'YYYY-MM-DD HH:MM:SS' 或 YYYYMMDDHHMMSS.uuuuuu 格式的值,具体取决于函数是在字符串还是数字上下文中使用。该值以当前时区表示

...和​​UNIX_TIMESTAMP()

如果不带参数调用,则返回 Unix 时间戳(自 '1970-01-01 00:00:00' UTC 以来的秒数)作为无符号整数。如果使用日期参数调用 UNIX_TIMESTAMP(),它会返回参数的值作为自 '1970-01-01 00:00:00' UTC 以来的秒数。date 可以是 DATE 字符串、DATETIME 字符串、TIMESTAMP 或格式为 YYMMDD 或 YYYYMMDD 的数字。服务器将日期解释为当前时区的值,并将其转换为 UTC 的内部值。

因此,首先,它们返回不同的东西:正确的日期与整数。

您实际上需要获得三个功能:

  1. 以相同的格式存储所有日期(UTC 或服务器的时区)
  2. 获取用户的时区
  3. 在用户的时区显示存储的日期

日期和时间函数一章提供了可用函数的摘要。如果你想以 UTC 存储日期,你会去UTC_TIMESTAMP()。如果你想使用服务器的时区,你可以使用NOW()。并且有CONVERT_TZ()进行转换。

然而,MySQL 不会帮助您解决第 2 点。您需要询问用户或使用 JavaScript 读取用户的时钟并将其发送到服务器以便您猜测(如果您不询问,您将始终需要猜测,因为通常有几个时区共享相同给定瞬间的时间)。

于 2013-02-13T09:36:29.343 回答