我有一个用户可以发表评论的博客。我使用NOW()
插入发布评论的时间,然后使用date('j M Y', stored timestamp)
显示他们发布评论的时间。
我想知道NOW()是否会返回locatime of the end user or the localtime at my server
。
是否更适合使用UNIX_TIMESTAMP
而不是NOW()
来计算用户发布评论的本地时间。
答案 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的内部值。
因此,首先,它们返回不同的东西:正确的日期与整数。
您实际上需要获得三个功能:
Date and Time functions章节提供了可用功能的摘要。如果您想以UTC格式存储日期,请转到UTC_TIMESTAMP()。如果要使用服务器的时区,可以使用NOW()。并且CONVERT_TZ()可以进行转化。
但是,MySQL不会帮助你解决第2点问题。您需要询问用户或使用JavaScript来读取用户的时钟并将其发送到服务器,这样您就可以猜测(如果您不问您总是需要猜测,因为通常有几个时区共享相同的时间在特定时刻的时间)。