Symfony中如何将Y-m-d格式日期存入DateTimeImmutable字段?
问题:如何将Y-m-d格式日期存入DateTimeImmutable类型的ORM字段?
你定义了如下ORM字段,希望存入Y-m-d格式的日期:
#[ORM\Column] private ?\DateTimeImmutable $created_at = null;
尝试两种方式处理日期时遇到问题:
- 使用DateTimeImmutable处理后保存:
$date = new DateTimeImmutable(); $date->setTimestamp($timestamp); $date->format("Y-m-d");
Symfony最终保存的格式是2023-01-17 14:34:55,包含时分秒。
- 使用date()函数生成字符串后保存:
$date = date("Y-m-d", $timestamp);
收到错误提示:must be of type DateTimeImmutable, string given
请问忽略了什么要点?
解答
1. ORM字段的类型约束必须遵守
你的created_at字段声明为?\DateTimeImmutable类型,这意味着只能给它赋值DateTimeImmutable(或其子类)对象,不能直接传入字符串。date()函数返回的是字符串类型,自然会触发类型不匹配的错误。
2. DateTimeImmutable是不可变对象,format()不修改原对象
DateTimeImmutable的设计是不可变的,调用format("Y-m-d")只是返回一个格式化后的字符串,不会改变原对象内部存储的完整日期时间数据。你调用这个方法后,原$date对象依然保留着时分秒信息,所以ORM保存时会存入带时间的完整格式。
正确的实现方式
如果只想保存日期部分(Y-m-d),可以用以下两种方案:
方案一:修改ORM字段的列类型
在Column注解里明确指定type="date",让ORM知道这个字段只需要存储日期,自动忽略时分秒:
#[ORM\Column(type: "date")] private ?\DateTimeImmutable $created_at = null;
此时正常赋值DateTimeImmutable对象即可,ORM会自动按日期格式存入数据库。
方案二:生成仅含日期的DateTimeImmutable对象
如果不想修改字段类型,可以创建一个时分秒都为0的DateTimeImmutable对象:
// 方式1:从格式化字符串创建 $date = DateTimeImmutable::createFromFormat('Y-m-d', date('Y-m-d', $timestamp)); // 方式2:基于时间戳生成后重置时间 $date = (new DateTimeImmutable())->setTimestamp($timestamp)->setTime(0, 0, 0);
这样对象的时分秒被设为00:00:00,保存到数据库时会呈现为YYYY-MM-DD 00:00:00,若数据库字段为DATE类型则只会存储日期部分。
内容的提问来源于stack exchange,提问作者tolga
相关产品推荐
相关产品推荐

