当前位置: 首页 > news >正文

hyperf中关于时间的设定

下面我来总结这三者的用法和它们之间的关系:

1. protected ?string $dateFormat = 'U';

作用

  • 定义数据库日期字段的存储格式
  • ‘U’ 表示使用 Unix 时间戳格式(秒级,10位数字)

影响范围

  • 决定了模型从数据库读取和写入数据时的格式
  • 当使用 save() 方法保存模型时,日期时间会按此格式存储到数据库

关键点

  • 这是日期在数据库层面的表示形式
  • 常用格式有 ‘Y-m-d H:i:s’(MySQL 标准日期时间)和 ‘U’(Unix 时间戳)

2. $casts = ['created_at' => 'datetime']

作用

  • 定义数据在 PHP 代码中的类型
  • 自动将数据库值转换为指定的 PHP 类型

影响范围

  • 从数据库读取时,datetime 会将时间戳转换为 DateTime 对象
  • 访问属性时会得到 DateTime 对象,而不是原始的时间戳

类型选项

  • datetime: 转换为 DateTime 对象,允许日期操作
  • timestamp: 保持为时间戳整数
  • date: 只有日期部分,没有时间
  • immutable_datetime: 不可变的 DateTime 对象

3. function serializeDate(DateTimeInterface $date)

作用

  • 控制模型序列化时日期时间的输出格式
  • 决定 toArray()toJson() 方法中日期的展示方式

影响范围

  • 仅影响模型转换为数组或 JSON 时的输出
  • 不影响数据库存储或属性访问

执行时机

  • 当调用 toArray()toJson() 方法时
  • 当使用 response()->json($model)

完整工作流程

  1. 数据库存储

    • $dateFormat = 'U' 决定以时间戳格式存储
  2. 数据从数据库读取

    • 读取原始时间戳值(如 1742887304)
    • 如果有 casts,将根据 casts 配置转换:
      • 'created_at' => 'datetime' 会将时间戳转换为 DateTime 对象
      • 'created_at' => 'timestamp' 会保持时间戳整数
  3. 属性访问

    • $model->created_at 会根据 casts 返回相应类型
    • datetime 类型返回 DateTime 对象
    • timestamp 类型返回整数
  4. 序列化输出

    • 当模型转换为数组或 JSON 时
    • 对于 datetime 类型,会调用 serializeDate() 方法
    • 返回方法中定义的格式,如 'Y-m-d H:i:s'
    • 对于 timestamp 类型,直接输出整数,不调用 serializeDate()

最佳实践

根据您的需求选择配置:

  1. 如果想在数据库中存储时间戳,但 API 输出格式化日期

    protected ?string $dateFormat = 'U';  // 数据库存储为时间戳
    protected array $casts = ['created_at' => 'datetime'];  // PHP 中使用 DateTime
    protected function serializeDate(DateTimeInterface $date): string|int
    {
        return $date->format('Y-m-d H:i:s');  // API 输出格式化日期
    }
    
  2. 如果想在数据库中存储时间戳,API 也输出时间戳

    protected ?string $dateFormat = 'U';  // 数据库存储为时间戳
    protected array $casts = ['created_at' => 'timestamp'];  // PHP 中使用时间戳
    // 不需要 serializeDate 方法,因为 timestamp 类型不会调用它
    
  3. 如果想在数据库中存储格式化日期,API 也输出格式化日期

    protected ?string $dateFormat = 'Y-m-d H:i:s';  // 数据库存储为格式化日期
    protected array $casts = ['created_at' => 'datetime'];  // PHP 中使用 DateTime
    protected function serializeDate(DateTimeInterface $date): string|int
    {
        return $date->format('Y-m-d H:i:s');  // API 输出格式化日期
    }
    
http://www.dtcms.com/a/90198.html

相关文章:

  • 【设计模式】代理模式(Proxy Pattern)详解
  • C++:类和对象(一)
  • css—— object-fit 属性
  • ENSP学习day10
  • 建立虚拟用户的账号数据库并为vsftpd服务器添加虚拟用户支持的脚本
  • vcd波形转仿真激励
  • JS自动装箱(Auto-boxing)机制深度解析
  • 基于ESP32和TinyUSB实现虚拟U盘功能的完整指南
  • Android实践开发制作小猴子摘桃小游戏
  • Qt 线程和 QObjects
  • [新闻.AI]国产大模型新突破:阿里开源 Qwen2.5-VL-32B 与 DeepSeek 升级 V3 模型
  • rosbag|ROS中.bag数据包转换为matlab中.mat数据类型
  • [250325] Claude AI 现已支持网络搜索功能!| ReactOS 0.4.15 发布!
  • libc2.27版本下的tcache
  • 【CXX-Qt】2.2 生成的 QObject
  • java项目之基于ssm的高校共享单车管理系统(源码+稳定)
  • 数据结构与算法-数据结构-线段树1(单点修改,区间查询):最大数,你能回答这些问题吗
  • XSS漏洞靶场
  • C++对象数组的使用
  • Web前端之UniApp、Taro、ReactNative和Flutter的区别
  • Python Django系列—多数据库
  • 信息集译码算法(ISD)
  • C++11QT复习 (五)
  • Lambda 和 Stream 从 0 到 1,从基础到实战
  • Go 语言当中的反射机制
  • 数据结构--二叉树--其一
  • 搭建k8s集群的可观测体系(log和metric)(已踩完坑)
  • 常用的几种思维方式
  • MySQL:DML
  • Node.js的安装和环境配置