2011-04-13 67 views
0

在Symfony的應用...Symfony /策略:基於時區格式化日期時間?

  1. 什麼是存儲用戶的時區信息的最佳方式?

    • 它是通過文化發現的嗎?
    • 應存儲哪些標準密鑰?使用PHP時區和商店作爲文本?
  2. 如何格式化表示層上的服務器日期時間?

    • 是否有PHP/Symfony幫手來做到這一點?

回答

0

關於你的第一個問題。 我不認爲用戶的時區是存儲的,但當然可以。 但是,您應該檢查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

3

我用下面的策略:

  • 服務器的日期時間爲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; 
}