MySQL timestamp 时间戳字段,据说只能到 2037年过,为什么 Laravel 还要默认使用这种字段作为新建时间,更新时间呢?

如题

本帖已被设为精华帖!
本帖由系统于 1年前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 40

@程事不足

我比较了一下:

datetime 和 timestamp

  1. datetime 更像日历上面的时间和你手表的时间的结合,就是指具体某个时间。
  2. timestamp 更适合来记录时间,比如我在东八区时间现在是 2016-08-02 10:35:52, 你在岛国(此时时间为 2016-08-02 11:35:52),我和你在聊天,数据库记录了时间,发过去的信息带上的时间是你在1小时前的? 好迷啊。当然有办法,自己计算时区。
  3. 时间范围是 timestamp 硬伤,当然 datetime 也记录不了刘备什么时候出生。

timestamp 和 UNIX timestamps

  1. 显示直观,出问题了便于排错,比好多很长的 int 数字好看多了
  2. int 是从1970年开始累加的,如果之前的时间需要用负数支持,数据库可能会有些问题,不过现在没什么问题了
  3. timestamp 是自带时区转换的,同上面的第2项。
  4. 用户前端输入的时间一般都是日期类型,如果存储 int 还需要存前取后处理
  5. UNIX timestamps 更快

个人总结(仅供参考):

  1. timestamp 记录经常变化的更新/创建/发布/日志时间等,并且是近来的时间,够用,免时区处理,给你我便利
  2. datetime 记录生日、纪念事件、超出 timestamp 的时间,记得时区处理
  3. UNIX timestamps 是自己的喜好
  4. 如果你不考虑时区,或者有自己一套的时区方案,随意了,喜欢哪个上哪个了
  5. laravel 是设计比较国际化的框架,为了程序员方便、符合数据库设计标准,所以 created_at updated_at 使用了 timestamp 是无可厚非的。
  6. 如果说有没有一个时间类型即解决了范围、时区的问题,这是不可能的,不是还有 tinyInt BigInt 吗?取自己所需,并且 MySQL 是允许数据库字段变更的。
7年前 评论

是因为在 Mysql 中 timestamp 类型通常作为记录数据创建时间,数据更新时间的,所以 laravel 用这个类型非常正确。如果你某些字段确实需要一些特殊的时间值,那么就用 datetime 毫无疑问无疑。

7年前 评论

@zhuzhichao 问题是过了2037年怎么办?

7年前 评论
monkey

Year 2038 problem

scream::scream:

7年前 评论
Summer

问的是 2038年问题 吧。

Laravel 这样做估计是为了利用 MySQL 的 CURRENT_TIMESTAMP 方法,从数据库层面去维护 created_atupdated_at ,参考 Illuminate/Database 源码中 MYSQL 创建 Timestamp 类型字段代码

到时候 2038 的时候,估计那个时候 Laravel 13 LTE (按大概每 2~3 年一个 LTE 版本发布)已经有很简单的方法来解决这个问题。

如果你现在实在想改掉:

1). 使用 dateTime 类型

$table->dateTime('created_at');
$table->dateTime('published_at');

2). Model 中设置手动更新

    public $timestamps = false;

参阅文档:时间戳

3). 在数据创建或者修改时候手动维护

$safe_date = new DateTime('2040-02-01');

$user = new User;
$user->created_at = $safe_date->format('l j F Y H:i');
7年前 评论

2038之后办法很简单的 $table->datetime('update_at')->change(); Done!

7年前 评论
Summer

@zhuzhichao 哈哈 :+1:

7年前 评论

@zhuzhichao 为啥不现在就用datetime呢?而且国人喜欢用整型来存放时间,就是距离1970年1月1日的秒数,到底哪种好呢?

7年前 评论

@Summer 其实还是可以自动维护的吧,据说是修改model中的代码

7年前 评论

@程事不足

我比较了一下:

datetime 和 timestamp

  1. datetime 更像日历上面的时间和你手表的时间的结合,就是指具体某个时间。
  2. timestamp 更适合来记录时间,比如我在东八区时间现在是 2016-08-02 10:35:52, 你在岛国(此时时间为 2016-08-02 11:35:52),我和你在聊天,数据库记录了时间,发过去的信息带上的时间是你在1小时前的? 好迷啊。当然有办法,自己计算时区。
  3. 时间范围是 timestamp 硬伤,当然 datetime 也记录不了刘备什么时候出生。

timestamp 和 UNIX timestamps

  1. 显示直观,出问题了便于排错,比好多很长的 int 数字好看多了
  2. int 是从1970年开始累加的,如果之前的时间需要用负数支持,数据库可能会有些问题,不过现在没什么问题了
  3. timestamp 是自带时区转换的,同上面的第2项。
  4. 用户前端输入的时间一般都是日期类型,如果存储 int 还需要存前取后处理
  5. UNIX timestamps 更快

个人总结(仅供参考):

  1. timestamp 记录经常变化的更新/创建/发布/日志时间等,并且是近来的时间,够用,免时区处理,给你我便利
  2. datetime 记录生日、纪念事件、超出 timestamp 的时间,记得时区处理
  3. UNIX timestamps 是自己的喜好
  4. 如果你不考虑时区,或者有自己一套的时区方案,随意了,喜欢哪个上哪个了
  5. laravel 是设计比较国际化的框架,为了程序员方便、符合数据库设计标准,所以 created_at updated_at 使用了 timestamp 是无可厚非的。
  6. 如果说有没有一个时间类型即解决了范围、时区的问题,这是不可能的,不是还有 tinyInt BigInt 吗?取自己所需,并且 MySQL 是允许数据库字段变更的。
7年前 评论
TimJuly

到时候MySQL就会去解决这个问题了.放心的用吧.

7年前 评论

2038年的时候,我会回来看这个帖子的,留名先

7年前 评论

@zhuzhichao 谢谢,你说得很详细

7年前 评论

@杨进春 到时候我们都老了 @Summer 都变成老司机了

7年前 评论
Summer

@overlords
@杨进春 愿春哥永生,愿大家看到这个话题的朋友都能永生 :innocent:

7年前 评论
J_Wang 2年前

timestamp 带国际化时区自动转化的啊

7年前 评论

2038年的时候,我会回来看这个帖子的,留名先 +1

5年前 评论

2038年的时候,我会回来看这个帖子的,留名先 +2

5年前 评论

2038年的时候,我会回来看这个帖子的,留名先 +3

希望那个时候我还写得动代码...

5年前 评论

2038年的时候,我会回来看这个帖子的,留名先 +4

5年前 评论

2038 年的时候,我会回来看这个帖子的,留名先 +5

4年前 评论

2038 年的时候,我会回来看这个帖子的,留名先 +6

4年前 评论

2038 年的时候,我会回来看这个帖子的,留名先 +7

4年前 评论

2038 年的时候,我会回来看这个帖子的,留名先 +8

4年前 评论

2038 年的时候,我会回来看这个帖子的,留名先 +9

4年前 评论

2038年的时候,我会回来看这个帖子的,留名先 +10

4年前 评论

2038 年的时候,我会回来看这个帖子的,留名先 +11

4年前 评论

2038 年的时候,我不会回来看这个帖子的,留名先 +12

4年前 评论

2038 年的时候,我不会回来看这个帖子的,留名先 +13

4年前 评论
月光

2038 年的时候,我不会回来看这个帖子的,留名先 +14

4年前 评论

2038 年的时候,我不会回来看这个帖子的,留名先 +15

4年前 评论

2038 年的时候,我会回来看这个帖子的,留名先 +16

4年前 评论

2038 年的时候,我会回来看这个帖子的,留名先 +17

4年前 评论

2038 年的时候,我会回来看这个帖子的,留名先 +18

3年前 评论

解决办法只有一个:2038年直接退休

3年前 评论

2038 年的时候,我会回来看这个帖子的,留名 lizesheng :joy:

3年前 评论

2038 年的时候,我会回来看这个帖子的,留名先 +19

2年前 评论

2038 年的时候,我会回来看这个帖子的,留名先 +20

1年前 评论

2038 年的时候,我会回来看这个帖子的,留名先 +21

1年前 评论
随波逐流

考古

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!