【问题标题】:Symfony/Strategy: formatting datetime based on timezone?Symfony/Strategy:根据时区格式化日期时间?
【发布时间】:2011-08-04 15:38:18
【问题描述】:

在 Symfony 应用程序中...

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

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

    • 是否有 PHP/Symfony 助手可以做到这一点?

【问题讨论】:

    标签: datetime symfony1 internationalization timezone


    【解决方案1】:

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

    对于格式化日期,您可以使用 Date 助手。它又使用sfDateFormat 类,该类由当前用户culture 初始化。 您还可以使用它来显示给定日期的时区。

    【讨论】:

    • 感谢毕业。但是如果我想存储时区,首选的数据类型是什么,我应该使用什么作为主数据?任何将时区作为输入的 sfDateFormat 代码 sn-p?
    • 首选数据类型取决于您希望如何向用户显示。当然偏移量足以计算,但如果你想将它呈现给你的用户,一个字符串会更好。而且我认为没有办法为时区提供 sfDateFormat 构造函数。我认为您必须创建自己的 Helper (/class) 来实现这一点,它应该只是将 UTC 时间“转换”为用户时区中的时间(然后将其传递给 DateHelper 函数?)。至少,我会这样做。
    【解决方案2】:

    我使用以下策略:

    • 服务器日期时间为 UTC
    • 所有日期都以 UTC 进行管理和存储
    • 用户配置文件表有一个文本类型的时区字段,其中存储了他的 PHP 时区
    • 用户可以在他们的个人资料页面中设置/更改他们的时区(选择小部件是sfWidgetFormI18nChoiceTimezone
    • 为了显示任何日期,我使用了一个小助手utcToLocal_date,它使用了Date 助手的format_date 函数:

    .

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多