我有一个Symfony实体,按如下方式存储生日:
/**
* @var \DateTime
* @Gedmo\Versioned
* @ORM\Column(name="birthday", type="date", nullable=true)
*/
protected $birthday;
在MySQL中,生日存储为日期类型,相应地。现在,要编辑实体,我使用带有Symfony DateType字段的表单作为生日:
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
...
->add('birthday', DateType::class, [
'required' => false,
'widget' => 'single_text',
'format' => 'dd.MM.yyyy',
'attr'=> [
'style'=>'',
],
])
...
;
}
有趣的是,当存储在数据库中的生日是1901年12月13日星期五之前的日期时,表单中出现了错误的日期(实际上是前一天的日期)。要了解发生了什么,我将表单构建器中的format属性更改为:
'format' => 'dd.MM.yyyy HH:mm:ss z',
例如,如果日期是< 26.02.1825'它显示' 25.02.1825 23:53:28 GMT + 0:53:28'在表单字段中,看起来它使用了一个非常奇怪的时区。因此,当我将MySQL日期条目转换为PHP中的DateTime对象时,一定会出现问题,我猜?
作为解决方法,我在转换后的值中添加了60分钟(在属性的getter中),但必须有一个正确的方法来处理它。有人可以帮助我吗?
我确定,以前这是一个问题,但我真的找不到任何类似的问题...
版本:
答案 0 :(得分:0)
我找到了一种在较低代码级别产生错误的方法:
$timestamp = -4570909200;
$dateTime = new \DateTime();
$dateTime->setTimestamp($timestamp);
print($dateTime->format('d.m.Y H:i:s').'<br>');
$formatter = new \IntlDateFormatter(\Locale::getDefault(), \IntlDateFormatter::MEDIUM, \IntlDateFormatter::NONE, 'Europe/Berlin', \IntlDateFormatter::GREGORIAN, 'dd.MM.yyyy HH:mm:ss (z)');
$formatter->setLenient(false);
$formatted = $formatter->format($timestamp);
print($formatted);
这会产生以下输出:
26.02.1825 00:00:00
25.02.1825 23:53:28 (GMT+0:53:28)
时区如欧洲/伦敦&#39;或者&#39;欧洲/苏黎世&#39;产生不同但同样奇怪的结果。也许,不应该使用这些特殊的时区,而是“CET&#39;”
我终于找到了一个类似的帖子,给出了答案: