2011-07-25 30 views
5

Yii中的新手問題: 我在Yii中有一個包含日期時間字段的表格模型。YII:如何更改視圖上顯示的日期時間格式

我使用CActiveForm顯示這一領域:

<div class="row"> 
    <?php echo $form->labelEx($model,'createdon'); ?> 
    <?php echo $form->textField($model,'createdon', array('id'=>'createdon')); ?> 
    <?php echo $form->error($model,'createdon'); ?> 
</div> 

,但顯示的文本字段是日期時間格式來自MySQL的是YYYY-MM-DD HH:MM:SS

怎麼可能我將文本字段上顯示的格式更改爲不同的時間格式? (也許dd/mm/yy或mm/dd/yy或其他)

任何幫助,將不勝感激。

謝謝!

回答

26

如果希望日期以一種格式存儲,但以另一種格式(即多個視圖)顯示,則考慮在模型中更改它。

例如:

class Whatever extends CActiveRecord  
{ 
    protected function afterFind() 
    { 
      // convert to display format 
     $this->createdon = strtotime ($this->createdon); 
     $this->createdon = date ('m/d/Y', $this->createdon); 

     parent::afterFind(); 
    } 

    protected function beforeValidate() 
    { 
      // convert to storage format 
     $this->createdon = strtotime ($this->createdon); 
     $this->createdon = date ('Y-m-d', $this->createdon); 

     return parent::beforeValidate(); 
    } 
} 

你重寫取決於哪種方法對你想達到的目標。

From the docs

  • 定製的CActiveRecord提供了一些佔位符的方法 可以在子類中重寫自定義其工作流程。
    • beforeValidate和afterValidate:在 之前和之後調用這些驗證。在保存AR實例之前和之後調用 。
    • beforeDelete和afterDelete: 這些在AR實例被刪除之前和之後被調用。
    • afterConstruct:針對使用 新操作符創建的每個AR實例調用此操作。
    • beforeFind:在用於執行查詢(例如,find(),findAll())的AR查找器爲 之前調用此操作。
    • afterFind:這是在作爲查詢結果創建的每個AR實例之後調用的 。
  • +0

    嘿...謝謝,afterFind()方法是我正在尋找的:) – Calua

    1

    所有你需要的是使用CDateFormatter和它的方法format

    ,或者你可以使用函數date

    我覺得有很多的例子PHP手冊上格式化選項(使用本地PHP的方式來格式化日期以及每種格式修飾符的含義),所以解決問題並不是一個問題,但如果Yii的CDateFormatter有任何問題,我可以舉幾個例子。

    +0

    我應該在哪裏之前格式化值顯示窗體上?我可以使用這樣的東西: <?php echo $ form-> textField($ model,date('d-m-Y','createdon'),array('id'=>'createdon')); ?> ?? 或者是否有任何Yii模型的事件或行爲,我可以做到這一點? – Calua

    +0

    基本上你希望你的日期由於語言環境而被格式化(你可以使用['CLocale'](http://www.yiiframework.com/doc/api/1.1/CLocale))來設置語言環境。在我看來,我通過了'CDateFormatter' - 這並沒有讓我感到困擾。如果您的項目是針對您所在地區進行本地化的,並且您不考慮將其本地化到其他地區,那麼您可以使用'date('dm-Y',)'(Yii只是提供給您一個工具 - 使用它是你選擇的問題)。否則,使用['CDateFormatter']與['CLocale']串聯更方便。 – Nemoden

    +0

    「或者是否有任何事件或行爲在yii模型上我可以做到?」。我沒有,但我認爲你可以附加一個行爲。 – Nemoden

    3

    這爲我工作:

    class SomeClass extends CActiveRecord 
    { 
    
        protected function afterFind() 
        { 
         // convert to display format 
         $this->my_date_time = DateTime::createFromFormat('Y-m-d H:i:s', $this->my_date_time)->format('d-m-Y'); 
    
         parent::afterFind(); 
        } 
    
        protected function beforeSave() 
        { 
         // convert to storage format 
         $this->my_date_time = DateTime::createFromFormat('d-m-Y', $this->my_date_time)->format('Y-m-d H:i:s'); 
    
         return parent::beforeSave(); 
        } 
    }