Laravel迁移:如何存储ISO8601格式时间?能否用非字符串类型?
解决方案:别纠结存储格式,在读取时处理才是正确姿势
首先得搞清楚:数据库的timestamp/datetime类型不是以字符串形式存储的,你看到的「2024-11-21 19:30:00」只是数据库客户端帮你转成的可读性格式,实际存的是更高效的时间戳或内部时间结构。所以没必要强行把带T的字符串存进去,反而会浪费时间类型的天然优势。
给你两个靠谱的解决办法:
Laravel 模型层面处理(推荐)
在对应模型里配置$casts属性,指定字段的格式化规则,这样每次从模型取数据时,自动输出ISO8601格式:protected $casts = [ 'start' => 'datetime:Y-m-d\TH:i:s', ];后续你调用
$model->start的时候,拿到的就是「2024-11-21T19:30:00」这种格式的字符串,存储端依然用$table->timestamp('start')完全没问题。数据库查询时直接格式化
如果是直接写SQL查询,用数据库的格式化函数处理输出,比如MySQL可以这么写:SELECT DATE_FORMAT(start, '%Y-%m-%dT%H:%i:%s') AS start FROM your_table;
千万别用string类型存时间,不然以后要做时间范围查询、排序、时区转换这些操作时,会麻烦到爆炸,完全没必要丢了数据库时间类型的优势。
内容的提问来源于stack exchange,提问作者ghost_of_the_code
相关产品推荐
相关产品推荐

