Laravel 数据迁移(Migrations)中 timestamp / dateTime / date / timestamps 的不同

说明

Laravel 数据迁移(Migrations) 中提供了几种创建时间的帮助函数,这里说下他们的不同点。

$table->timestamp('published_at');
$table->dateTime('published_at');
$table->date('published_at');
$table->timestamps();

timestamp() 和 dateTime()

timestamp 和 dateTime 类似,他们存储了 日期(YYYY-MM-DD) 加上 时间 (HH:MM:SS) ,如:YYYY-MM-DD HH:MM:SS。

不同的是 timestamp 可以利用 MySQL 的 CURRENT_TIMESTAMP 方法,从数据库层面去维护 created_at 和 updated_at ,参考 Illuminate/Database 源码中 MYSQL 创建 Timestamp 类型字段代码

需要注意的是,timestamp 的数据范围是 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC ,也就是说大于 2038-01-19 03:14:07 的值数据库是无法存储的,会变为 0000-00-00 00:00:00,这也是 MySQL 知名的 2038年问题

dateTime 的存储范围是 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59,所以,在选择字段的存储类型的时候,请仔细考虑下用例。

date()

只是存储了日期格式,如:YYYY-MM-DD (1000-00-01~ 9999-12-31)

timestamps()

创建了 created_at 和 updated_at 字段,格式为 timestamp。

【番外篇】更改 timestamps 为 dateTime

既然 timestamps 有 2038年问题,你想使用 dateTime 的话,在 Laravel 中,你只需要在创建的时候,指定为 dateTime 类型即可:

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

Laravel 将会自动维护(感谢 @程事不足 指出)。

参阅文档:时间戳

现有字段修改

可以使用(Thanks @zhuzhichao ):

 $table->datetime('update_at')->change(); 
摈弃世俗浮躁,追求技术精湛
本帖已被设为精华帖!
本帖由 Summer 于 7年前 加精
Summer
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 3

好像用其他格式的时间戳也可以自动维护的吧

7年前 评论
Summer

@程事不足 确实可以,多谢指出

7年前 评论
wonbin

使用timestamp 需要注意时区,时区改变 时间就变了

4年前 评论

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