Symfony2在表单中使用时区渲染datetime

时间:2013-03-04 05:45:12

标签: symfony timezone utc

在我的系统中,数据库时间戳记录为UTC值。

每个用户的个人资料中都记录了一个时区。登录时,时区值会从其个人资料转移到其会话中($ session-> set('timezone',$ tz);)。

我的大多数代码都使用Sonata INTL捆绑包,因此用户可以看到正确显示其时区的日期时间值,除了在表单字段中。

我最近在一些Symfony2类型上发现了model_timezone和view_timezone字段。我可以让字段显示正确的值(如下面的代码片段所示),但是我想了解如何从用户会话中填充view_timezone? (我猜我可以通过某种方式传递$选项?)

Event Controller代码段:

$object = <object loaded>;

$form = $this->createForm(new MyEventType(), $object);

MyEventType表格摘要:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('id', null, array(
        'label'         => 'Event ID',
    ));

    $builder->add('changed', 'datetime', array(
        'date_widget'       => 'single_text',
        'date_format'       => \IntlDateFormatter::SHORT,
        'time_widget'       => 'single_text',

        'model_timezone'    => 'UTC',
        'view_timezone'     => 'Pacific/Auckland',
    ));

1 个答案:

答案 0 :(得分:5)

这个问题的解决方案有两个方面:

  • 将一系列选项传递给createForm方法,其中包含“view_timezone”
  • 的值
  • 确保在表单默认选项中定义'view_timezone'。

我已更新了我的代码段以反映所需的更改:

Event Controller代码段:

$object = <object loaded>;

$form = $this->createForm(new MyEventType(), $object, array(
    'view_timezone' => $this->container->get('session')->get('timezone'))
);

MyEventType表格摘要:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('id', null, array(
        'label'         => 'Event ID',
    ));

    $builder->add('changed', 'datetime', array(
        'date_widget'       => 'single_text',
        'date_format'       => \IntlDateFormatter::SHORT,
        'time_widget'       => 'single_text',

        'model_timezone'    => 'UTC',
        'view_timezone'     => $options['view_timezone'],
    ));

...

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class'        => 'Stuff\CoreBundle\Entity\MyEvent',
        'view_timezone'     => 'UTC',
    ));
}