【问题标题】:Symfony2 Rendering datetime with timezone in formsSymfony2在表单中呈现带有时区的日期时间
【发布时间】:2013-03-04 05:45:12
【问题描述】:

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

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

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

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

事件控制器sn-p:

$object = <object loaded>;

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

MyEventType 表单 sn-p:

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',
    ));

【问题讨论】:

  • 还有什么问题?您可以将会话值添加到“view_timezone”选项
  • 嗨哈斯特,我想问题应该这样表述:“如何将我的会话值放入表单中?”我有许多具有日期时间字段的表单。所以使用的方法应该很容易重复。

标签: symfony timezone utc


【解决方案1】:

解决这个问题的方法有两个:

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

我已更新我的代码 sn-ps 以反映所需的更改:

事件控制器sn-p:

$object = <object loaded>;

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

MyEventType 表单 sn-p:

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',
    ));
}

【讨论】:

  • 如果我在表单中有一个带有日期字段的时区字段,并且我想在存储日期时使用该时区怎么办?
猜你喜欢
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 2019-01-28
相关资源
最近更新 更多