Symfony /策略:基于时区格式化日期时间?

问题描述:

在Symfony的应用...Symfony /策略:基于时区格式化日期时间?

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

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

    • 是否有PHP/Symfony帮手来做到这一点?

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

对于格式化日期,您可以使用Date帮助程序。后者依次使用sfDateFormat类,该类使用当前用户文化进行初始化。 您也可以使用它来显示给定日期的时区。

+0

谢谢Grad。但是,如果我想存储时区,首选的数据类型是什么,我应该使用什么作为主数据? sfDateFormat需要时区作为输入的任何代码片段? – Prasad 2011-04-14 03:42:01

+1

首选数据类型取决于你想如何显示给你的用户。当然,偏移量足以进行计算,但如果要将其呈现给用户,字符串会更好。 我认为没有办法用sfDateFormat构造函数提供时区。我认为你将不得不创建自己的Helper(/ class)来实现这一点,除了将UTC时间翻译成用户时区中的某个时间(然后将它传递给DateHelper函数?至少,我就是这么做的。 – 2011-04-14 08:35:55

我用下面的策略:

  • 服务器的日期时间为UTC
  • 所有日期的管理和存储在UTC
  • 用户资料表具有用于保存他的PHP时区类型文本区字段
  • 用户可以设置/改变他们的时区在他们的个人资料页(选择widget是sfWidgetFormI18nChoiceTimezone
  • 显示任何日期,我用一个小帮手utcToLocal_date其中使用功能的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; 
}