You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 00:59:56