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();
好像用其他格式的时间戳也可以自动维护的吧
@程事不足 确实可以,多谢指出
使用timestamp 需要注意时区,时区改变 时间就变了