Datetime Symfony/策略:根据时区格式化日期时间?

Datetime Symfony/策略:根据时区格式化日期时间?,datetime,symfony1,internationalization,timezone,Datetime,Symfony1,Internationalization,Timezone,在Symfony应用程序中 存储用户时区信息的最佳方式是什么 它是通过文化发现的吗 应该存储哪些标准密钥?使用PHP时区并存储为文本 如何在表示层上格式化服务器日期时间 是否有PHP/Symfony帮助程序可以做到这一点 关于你的第一个问题。 我认为没有为用户存储时区,但当然可以。 但是您应该检查settings.yml中settings下的default\u时区设置 对于格式化日期,可以使用日期帮助程序。它依次使用sfDateFormat类,该类使用当前用户区域性初始化。 您还可以使用

在Symfony应用程序中

  • 存储用户时区信息的最佳方式是什么

    • 它是通过文化发现的吗
    • 应该存储哪些标准密钥?使用PHP时区并存储为文本
  • 如何在表示层上格式化服务器日期时间

    • 是否有PHP/Symfony帮助程序可以做到这一点
  • 关于你的第一个问题。 我认为没有为用户存储时区,但当然可以。 但是您应该检查
    settings.yml
    settings
    下的
    default\u时区设置

    对于格式化日期,可以使用
    日期
    帮助程序。它依次使用
    sfDateFormat
    类,该类使用当前用户区域性初始化。 您还可以使用它来显示给定日期的时区。

    关于您的第一个问题。 我认为没有为用户存储时区,但当然可以。 但是您应该检查
    settings.yml
    settings
    下的
    default\u时区设置

    对于格式化日期,可以使用
    日期
    帮助程序。它依次使用
    sfDateFormat
    类,该类使用当前用户区域性初始化。
    您还可以使用它来显示给定日期的时区。

    我使用以下策略:

    • 服务器日期时间为UTC
    • 所有日期都在UTC中管理和存储
    • 用户配置文件表有一个文本类型的时区字段,其中存储了他的PHP时区
    • 用户可以在他们的配置文件页面中设置/更改他们的时区(选择widget is
      sfWidgetFormI18nChoiceTimezone
    • 为了显示任何日期,我使用了一个小型助手
      utcToLocal\u date
      ,它使用
      date
      助手的
      format\u date
      功能:


    我使用以下策略:

    • 服务器日期时间为UTC
    • 所有日期都在UTC中管理和存储
    • 用户配置文件表有一个文本类型的时区字段,其中存储了他的PHP时区
    • 用户可以在他们的配置文件页面中设置/更改他们的时区(选择widget is
      sfWidgetFormI18nChoiceTimezone
    • 为了显示任何日期,我使用了一个小型助手
      utcToLocal\u date
      ,它使用
      date
      助手的
      format\u date
      功能:


    谢谢你,格拉德。但是,如果我希望存储时区,首选的数据类型是什么,我应该使用什么作为主数据?任何以时区作为输入的sfDateFormat的代码段?首选数据类型取决于您希望如何向用户显示它。当然,偏移量足以计算,但如果您想将其呈现给用户,字符串会更好。我认为没有一种方法可以为时区提供sfDateFormat构造函数。我认为您必须创建自己的助手(/class)来实现这一点,它只需将UTC时间“转换”为用户时区中的时间(然后将其传递给DateHelper函数?)。至少,我会这么做的。谢谢你,格拉德。但是,如果我希望存储时区,首选的数据类型是什么,我应该使用什么作为主数据?任何以时区作为输入的sfDateFormat的代码段?首选数据类型取决于您希望如何向用户显示它。当然,偏移量足以计算,但如果您想将其呈现给用户,字符串会更好。我认为没有一种方法可以为时区提供sfDateFormat构造函数。我认为您必须创建自己的助手(/class)来实现这一点,它只需将UTC时间“转换”为用户时区中的时间(然后将其传递给DateHelper函数?)。至少,我会这样做。
    function utcToLocal_date($originedatetime, $format = 'g')
    {
        if (class_exists('sfContext', false) && sfContext::hasInstance() && sfConfig::get('sf_i18n'))
        {
            $timezone = sfContext::getInstance()->getUser()->getProfile()->getTimezone();
            if (!empty($timezone) && ($newtimezone = new DateTimeZone($timezone)))
            {
                $datetime = new DateTime($originedatetime);
                $datetime->setTimezone($newtimezone);
                $originedatetime = $datetime->format("Y-m-d H:i:s");
            }
        }
        if (function_exists('format_date'))
        {
            return format_date($originedatetime, $format);
        }
        return $originedatetime;
    }