MySQL中的UNIX_TIMESTAMP和NOW()之间的区别

时间:2013-02-13 09:08:07

标签: mysql date unix-timestamp

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

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

3 个答案:

答案 0 :(得分:6)

MySQL UNIX_TIMESTAMP()以“1970-01-01 00:00:00”UTC为单位返回Unix时间戳,以无符号整数形式返回,如果没有参数传递UNIT_TIMESTAMP().

当此函数与date参数一起使用时,它会将参数的值作为无符号整数返回,自“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 |
+---------------------+-----------------------+

答案 1 :(得分:4)

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

但是,使用UNIX_TIMESTAMP()存储时间会更好,这以GMT表示。这样做可以更容易根据访问者的国家/地区进行格式化(例如,使用JavaScript)。

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

答案 2 :(得分:1)

让我们看一下手册对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. 获取用户的时区
  4. 在用户的时区显示存储日期
  5. Date and Time functions章节提供了可用功能的摘要。如果您想以UTC格式存储日期,请转到UTC_TIMESTAMP()。如果要使用服务器的时区,可以使用NOW()。并且CONVERT_TZ()可以进行转化。

    但是,MySQL不会帮助你解决第2点问题。您需要询问用户或使用JavaScript来读取用户的时钟并将其发送到服务器,这样您就可以猜测(如果您不问您总是需要猜测,因为通常有几个时区共享相同的时间在特定时刻的时间)。