【问题标题】:PHP - Storing unix timestamp in mysql (avoiding the time_t overflow)PHP - 在 mysql 中存储 unix 时间戳(避免 time_t 溢出)
【发布时间】:2013-08-07 02:52:49
【问题描述】:

我刚刚意识到 2038 年的问题,即 unix 时间将被重置为负的最小范围,所以我决定对这个有趣的话题进行一些研究。

现在我正在设计数据库的结构(在mysql中),我认为这两个考虑可能会解决问题:

1) - 不是将时间数据存储在时间戳字段中,而是存储在 bigint(或更大)列中。

2) - 我将用于我的应用程序的服务器使用 64 位操作系统,因此如果我使用 php date 函数,它将正确返回日期。

基于我即将接受使用时间戳的这些考虑,您对此有何看法?谢谢。。

【问题讨论】:

    标签: php mysql unix timestamp year2038


    【解决方案1】:

    MySQL DATETIME 列的范围一直到 9999-12-31 23:59:59,所以如果您担心 Y2K38 问题,我建议您使用这些而不是 TIMESTAMP

    TIMESTAMP 相对于DATETIME 的唯一优势是自动时区转换,但我们倾向于将所有时间存储为 UTC,因此这对我们来说不是问题。

    如果您真的想要使用时间戳,那么我很确定会在 2038 年之前齐心协力将 MySQL 和 C 系统升级到具有更大范围的time_t .由于它是 C 下的独特类型,因此更新起来相当容易。

    而且,与 C 中的平面文件不同,迁移数据库数据会容易得多,因为列元数据(例如 哪些 列包含时间戳)很容易获得。

    【讨论】:

    • 感谢您的回答,一开始我决定使用时间戳,因为我使用的服务器(免费托管)与我的时区不同,所以一个快速的解决方案可能是用 php 产生时间差(带走),然后把那个时间作为一切的基础(包括通过那个函数注册),那么除了 datetime 之外,还有什么可能/体面的解决方案可以做到这一点?
    • @Neo,我们的应用程序在不同的时区运行,根据配置项简单地调整查询以适应。换句话说,来自用户的时间信息尽可能早地转移到UTC,而给用户的时间信息尽可能晚地转移回本地。但是,请参阅 mu 倒数第二段,这永远不会成为问题,因为早在 2038 年之前,基础类型就会发生变化以解决此问题。
    • 我刚刚发现有一个mysql函数叫CONVERT_TZ,它有3个参数,日期,从时区和到时区,这可能是我最好的解决方案:)
    • @Neo,这对您的 y2k38 问题没有帮助。来自文档:如果从 from_tz 转换为 UTC 时该值超出 TIMESTAMP 类型的支持范围,则不会发生转换。它现在可以工作,但使用时间戳也是如此:-)
    • 我在谈论将它与日期时间字段一起使用,它有效吗?如果是这样,那么 y2k38 问题就没有问题,因为建议使用 datetime 来避免这种情况。
    猜你喜欢
    • 2011-10-12
    • 1970-01-01
    • 2017-06-14
    • 2017-02-15
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    相关资源
    最近更新 更多