【问题标题】:Symfony buildForm convert datetime to local and back to utcSymfony buildForm 将日期时间转换为本地时间并返回到 UTC
【发布时间】:2025-11-23 16:10:01
【问题描述】:

所以我想显示在当地时间设置活动日期的选项,但将其保存为 UTC 作为 symfony 标准。我有 5 个不同的用户段,有 5 个不同的时区值。用户可以在表单中设置新活动。每个用户实体都有自己的时区集。我的问题是在哪里设置转换?我的用户实体处于登录用户会话状态。

在我调用 formBuilder 的 ControllerAction 中?

在formBuilder中?

formbuilder 对我来说仍然有点模糊,我知道其中发生了很多事情。

formBuilder,简化:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    //...
    $builder->add('name');
    $builder->add('startDate', DateTimeType::class, array(
        'widget' => 'single_text',
        'format' => 'yyyy-MM-dd HH:mm',
        )
    );
    $builder->add('endDate', DateTimeType::class, array(
        'widget' => 'single_text',
        'format' => 'yyyy-MM-dd HH:mm',
        )
    );

    //...

    $builder->add('submit', SubmitType::class, array('attr' => array('class' => 'button')));
}

ControllerAction:

public function activityAction(Request $request, Activity $activity){
    $variables = array();
    /**
    * TODO Determine User Local timezone and store as UTC
    *
    */

    $user = $this->get('security.token_storage')->getToken()->getUser();
    $timezone = $user->getTimezone();

    $activity = new Activity();

    $form = $this->createForm(ActivityType::class, $activity);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {

        $activity->setName($form->get('name')->getData());

        /**
        *
        * Maybe here, (I've just realized)
        * Because earlier, the form just handled the datetime without conversion
        * And just stored them in the DB as they where
        *
        */

        // Example: $timezone = 'Europe/London';
        $date = new DateTime();
        $date->setTimestamp( $form->get('startDate')->getData() );
        $date->setTimezone(new DateTimeZone($timezone));   
        $activity->setStartDate($date->format("Y-m-d H:i:s"));

        $date = new DateTime();
        $date->setTimestamp( $form->get('endDate')->getData() );
        $date->setTimezone(new DateTimeZone($timezone));   
        $activity->setEndDate($date->format("Y-m-d H:i:s"));


        $em = $this->getDoctrine()->getManager();
        $em->persist($activity);
        $em->flush();
    }
    elseif ($form->isSubmitted() && !$form->isValid() ) {
        $variables['message'] = 'Something went wrong!';

    }

    $variables["title"] = "Create Activty";
    $variables["form"] = $form->createView();
    return $this->render('AcmeBundle:SomeViews:activity.html.twig', $variables);
}

所以我相信,我刚刚回答了我自己的问题,这迫使我问;这是您的惯例/最佳实践吗?

【问题讨论】:

    标签: php symfony datetime model-view-controller utc


    【解决方案1】:

    你把这件事复杂化了。 Symfony2 表单已经很好地涵盖了这一点。

    请看:

    模型时区: http://symfony.com/doc/current/reference/forms/types/date.html#model-timezone

    查看时区: http://symfony.com/doc/current/reference/forms/types/date.html#view-timezone

    正确使用这些可以解决您的问题,而无需任何额外的代码。

    您可以将您的用户细分(或您用来推断哪个是正确时区的任何数据)注入您的表单,并使用该用户细分上的时区在您的日期字段上设置 view_timezone。无论如何,都是这样的:)

    【讨论】:

    • 谢谢!我一直在拔头发,直到我注意到我的开发机器在 CEST 上,而生产服务器在 UTC 上。但这成功了!
    最近更新 更多