Symfony5控制器与Twig模板日期输出不一致 循环内小时显示00.00
Symfony 5 循环渲染Twig日期字段小时固定显示00:00问题
问题复现条件
开发环境:Symfony 5
实体包含两个日期字段:
daterecievedDate
异常表现:
- 数据表格循环场景下,用Twig语法
{{ record.date | date('H : i')}}渲染时,date字段小时显示正常,recievedDate小时始终显示为00.00,和实际存储值不符 - 仅带单个日期字段的其他实体也存在同类问题:Twig循环渲染时小时固定显示
00.00 - 控制器层用
foreach遍历findAll()查询结果,dump输出日期字段时小时值完全正确;但结果集传递到Twig模板循环渲染时就出现小时显示错误 - 出问题的字段正常值应为
8:50 - 非循环场景下,用
find($id)获取单个实体渲染日期,显示完全正常
相关排查截图:


根因与解决方法
这个问题基本都是Doctrine字段映射配错了,按以下步骤排查修复就行:
- 先查实体类的字段注解/yml/xml映射,所有出问题的日期字段,Doctrine类型必须是
datetime,不能是date- 配成
date类型的话,Doctrine从数据库读值的时候只会保留年月日,时分秒直接重置成00:00:00,和你遇到的现象完全对上 - 错误写法(注解示例):
/** * @ORM\Column(type="date") */ private $recievedDate; - 正确写法:
/** * @ORM\Column(type="datetime") */ private $recievedDate; - 改完映射别忘跑迁移:执行
php bin/console doctrine:migrations:diff生成迁移文件,再执行php bin/console doctrine:migrations:migrate同步表结构,确保数据库里对应字段是DATETIME类型,不是DATE类型。
- 配成
- 映射没问题就查两个点:
- 看对应日期字段的Getter方法,不要返回
date('Y-m-d', $this->recievedDate->getTimestamp())这种只有年月日的字符串,Twig的date过滤器拿到这种字符串解析不出时分秒,就会默认显示00:00 - 渲染的时候显式指定时区,别让Twig自己猜,比如国内时区就这么写:
{{ record.recievedDate|date('H:i', 'Asia/Shanghai') }}
- 看对应日期字段的Getter方法,不要返回
- 至于为什么控制器dump正常、单条find正常、循环就出问题:这是Doctrine的hydration(值转换)时机差导致的。控制器里dump的时候,Doctrine还没完成集合字段的全量类型转换,拿到的是原始带时分秒的数据库值;单条find的hydration逻辑和批量findAll不一样,不会触发这个类型截断,所以显示正常。
内容的提问来源于stack exchange,提问作者yavuz16dev
相关产品推荐
相关产品推荐

