【问题标题】:Should I use a timestamp or text field in MySQl for UTC time/date我应该在 MySQl 中使用时间戳还是文本字段作为 UTC 时间/日期
【发布时间】:2011-01-01 07:57:57
【问题描述】:

我读到一个 mysql 时间戳只能保存从 19700101000000 到 2037 年某个时间的值。我严重怀疑我的应用程序会在那时出现,我敢肯定它不会出现,但不知道人们会使用什么作为时间戳,文本字段?

下面是我当前如何插入带有 datetime mysql 字段的 mysql 记录的示例,您可以看到我在下面的 PHP 中使用 now(),现在我正在重新编码我的网站和我将提供时区支持以向用户显示正确的时间,因此我需要将日期和时间保存为 UTC 时间戳。

<?PHP
$sql = "INSERT INTO online_users 
    (user_id,
    online_id,
    ip,
    datetime,
    location,
    gender) 
    values ('$cache->userid,$unid,$LOCALIP,NOW(),$location,$g)";
executeQuery($sql);
?>

根据我上面的代码和上面的信息,我将如何格式化此代码以将时间和日期插入 UTC,我应该在 MySQL 中使用时间戳字段还是文本字段?当我经常显示它时,我需要修改我的 php 中的时间,例如在一些帖子中,我计算了自 mysql 时间(2 天 4 小时 34 秒前)以来经过的时间。我还需要花时间查询过去一周的用户登录等事情。我不是在问如何做这些事情,我只是发布它来显示我将使用时间的内容,以防万一这有助于确定我应该将其保存为的最佳方法。

【问题讨论】:

    标签: php mysql datetime timestamp


    【解决方案1】:

    我会将时间戳字段用于日期,因为它会使排序/过滤比在文本字段上更快。 26 年后,您可以与我们联系,了解您需要做些什么来度过 Y2K37。

    ;-)

    【讨论】:

      【解决方案2】:

      存储日期时间的最佳列是DATETIME。它简化了您的代码和查询,因为您不必一直来回转换为整数时间戳,并且 MySQL 会为您处理所有日期比较逻辑。

      您可以使用 MySQL UTC_DATE()UTC_TIME()UTC_TIMESTAMP() 函数代替 NOW() 来获取 MySQL 中的当前 UTC 时间戳。

      【讨论】:

      • 如果您使用 TIMESTAMP 列,MySQL 会自动将所有日期转换为 UTC,而不需要特殊的 UTC_* 函数。
      • 现在我真的很困惑,我知道你是一个可靠的来源,但我一遍又一遍地阅读,如果我想转换时区,我不应该再使用 DATETIME。我确实喜欢使用 DATETIME 进行转换是多么简单,但 date_default_timezone_set($_SESSION['time_zone']);仍然可以正确转换,我很确定 date_default_timezone_set 必须使用 UTC 时间戳才能做到这一点很神奇?
      • @jasondavis - 你没有理由不能使用 DATETIME。 TIMESTAMP 列有一些特殊的注意事项 - 它们被转换为 UTC 进行存储,但是当您选择它们​​时它们也被转换回系统时区。 TIMESTAMPS 只能存储有限范围的日期,如果您不小心创建它们,它们会在您更新记录的任何部分时自动更新。由于无论如何您都将日期转换为用户的时区,因此 TIMESTAMPS 的自动转换没有任何好处。您可以轻松存储硬 UTC 日期。
      • @jason - 也可以查看这个帖子:stackoverflow.com/questions/409286/datetime-vs-timestamp
      • 谢谢,我也只是在查看 facebook API 文档,他们在开发区的 FQL 部分列出了大多数 mysql 表,例如在 cmets 表上,他们使用了这个:int A Unix与评论创建时间相关的时间戳。因此,它们似乎将其存储为“整数”,而不是任何时间戳或日期时间。然后,我查看了他们拥有的其他表中的其他日期和时间,其中的时间戳会给某些人带来问题,他们将其存储为“字符串”,而对于他们使用“时间”之类的个人资料更新时间,我假设是一个..
      【解决方案3】:

      如果您需要支持不同的时区,最明智的日期选择是TIMESTAMP 列类型,即使它的范围最多为2038-01-19 03:14:07。这仍然会给你 28 年的时间来思考如何解决这个问题。

      使用 TIMESTAMP 列类型的好处是所有日期都保存为 UTC 并根据请求转换为所需的时区。这样您就不必太担心时区了。不过,它并不能解决你所有的问题。

      【讨论】:

      • TIMESTAMPS 保存为 UTC,但 SELECT 语句将它们作为系统设置的任何时区拉出。因此,除非您将系统时间设置为 UTC,否则您不会从数据库中获取 UTC 时间戳。你仍然需要在 PHP 中转换它。
      • 当您说我的系统时间时,您指的是我的服务器和 mysql 服务器设置的位置还是我家里的系统/电脑?如果您的意思是服务器,也许将服务器设置为 UTC 对我来说是个好主意,因为它位于不同的时区,那么无论如何我都是
      • 用于转换的 MySQL 时区(包括 SELECT)可以为每个连接设置stackoverflow.com/questions/409286/datetime-vs-timestamp/… - 因此,您不必在 PHP 端进行转换。
      【解决方案4】:

      您也可以使用ON UPDATE CURRENT_TIMESTAMP 在行更新时更新字段

      【讨论】:

      • 很高兴知道,但对于我的许多表格,当用户编辑内容时会产生不良影响
      【解决方案5】:

      我尝试了这个问题/答案中提到的所有内容,但没有任何工作正常,最后我能够让 php timezones date_default_timezone_set() 函数与我的 mysql 日期和时间一起正常工作的唯一方法是将它们存储为整数,然后完美运行。对我来说,排序速度较慢没有问题,因为我按 ID 号而不是日期排序,但是一旦我弄清楚两者之间有多少秒,我认为按日期排序不会太难。

      当我在 mysql 中使用整数字段时,我可以将 UTC 时间戳存储为 1262658989。当您在 mysql 中使用时间戳或日期时间字段时,它会自动将其转换为这种样式 2003-04-14 00:00:00由于某种原因,这使得使用时区变得非常困难。

      使用整数代替我可以使用以下代码在 PHP 中获取 UTC 时间戳:

      gmdate('U', time())
      

      【讨论】:

      • 注意:MySQL UNIX_TIMESTAMP() 函数将返回来自 TIMESTAMP 列的实际整数值,不进行转换。 (这为您提供相同的结果集,从数据库返回一个 INTEGER 值。)正如您所注意到的,您必须在数据库中使用 TIMESTAMP(与 INTEGER)数据类型处理的问题是隐式时区转换。
      【解决方案6】:

      我一直将纪元/unix 时间作为有符号整数存储在数据库字段中。 MySQL 有 UNIX_TIMESTAMP()FROM_UNIXTIME() 函数。我已经并且将继续为此受到抨击,但是日期数学很容易,这种日期格式的应用程序语言支持几乎无处不在,而且我可以维护操作系统(例如航空公司调度信息),而无需担心有关 DST 更正的政治异想天开系统/运行时更新。

      一些网站甚至不费心进行日期转换,而是允许客户端的 JavaScript 将其投影到本地时间。

      您提到的时间增量(即上次查看之间的时间间隔)可以很容易地得到帮助,因为您可以立即获得经过的秒数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-14
        • 2012-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多