MySQL日期为Symfony2.8-Form中的PHP DateTime转换

时间:2018-02-16 22:39:29

标签: php mysql datetime doctrine symfony-2.8

我有一个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中),但必须有一个正确的方法来处理它。有人可以帮助我吗?

我确定,以前这是一个问题,但我真的找不到任何类似的问题...

版本:

  • PHP 7.0.27
  • Symfony 2.8
  • Doctine 1.6

1 个答案:

答案 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;”

我终于找到了一个类似的帖子,给出了答案:

PHP IntlDateFormatter wrong date/time conversion