unchanged
Title
Using International Dates
Introduction ------------------ I needed British (dd/mm/yyyy) formatted dates throughout my application but found it very difficult to find examples of how to do this - until I found this excellent forum post [http://www.yiiframework.com/forum/index.php?/topic/3649-dealing-with-i18n-date-formats/](http://www.yiiframework.com/forum/index.php?/topic/3649-dealing-with-i18n-date-formats/ "http://www.yiiframework.com/forum/index.php?/topic/3649-dealing-with-i18n-date-formats/") Sohereshere is my complete solution - note that I'm using the 'short' date format throughout. Set the Locale ------------------ Add this line to protected/main/config.php, I have it just after the application name ~~~ [php] return array( 'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..', 'name'=>'My Application', 'sourceLanguage'=>'en_gb', ~~~ Set the validation rule ------------------ In your model, eg: protected/models/client.php add this format rule for any dates ~~~ [php] public function rules() { return array( ... array('date_of_birth','date','format'=>Yii::app()->locale->getDateFormat('short')), ... ~~~ Saving dates ------------------ I've modified the above forum post so that its set for short dates. Again this is in your model ~~~ [php] protected function beforeSave() {if(parent::beforeSave()) { //if(parent::beforeSave()) { // Format dates based on the localeforeach($this->metadata->tableSchema->columnsforeach($this->metadata->tableSchema->columns as $columnName => $column){ if{ if ($column->dbType == 'date'){ $this->$columnName{ $this->$columnName = date('Y-m-d',CDateTimeParser::parse($this->$columnName, Yii::app()->locale->getDateFormat('short'))); } elseifCDateTimeParser::parse($this->$columnName, Yii::app()->locale->getDateFormat('short'))); } elseif ($column->dbType == 'datetime'){ $this->$columnName{ $this->$columnName = date('Y-m-d H:i:s',CDateTimeParser::parse($this->$columnName, Yii::app()->locale->getDateTimeFormat('short'))); } } returnCDateTimeParser::parse($this->$columnName, Yii::app()->locale->getDateTimeFormat('short'))); } } return true;} else return} else return false; } ~~~ Formatting dates ------------------ And finally formatting the dates after a find - again this is in your model. ~~~ [php] protected function afterFind() {//// Format dates based on the localeforeach($this->metadata->tableSchema->columnsforeach($this->metadata->tableSchema->columns as $columnName => $column){ if{ if (!strlen($this->$columnName)) continue;ifif ($column->dbType == 'date'){ $this->$columnName{ $this->$columnName = Yii::app()->dateFormatter->formatDateTime(CDateTimeParser::parse($this->$columnName, 'yyyy-MM-dd'),'short',null); } elseifCDateTimeParser::parse( $this->$columnName, 'yyyy-MM-dd' ), 'short',null ); } elseif ($column->dbType == 'datetime'){ $this->$columnName{ $this->$columnName = Yii::app()->dateFormatter->formatDateTime(CDateTimeParser::parse($this->$columnName, 'yyyy-MM-dd hh:mm:ss'),'short','short'); } } returnCDateTimeParser::parse( $this->$columnName, 'yyyy-MM-dd hh:mm:ss' ), 'short','short' ); } } return true; } ~~~ Changing the target language ------------------ In theory (I haven't tested it) you should be able to change the target language on the fly - my plan is when a user registers, the locale is set after login and so the dates are formatted accordingly. ~~~ [php] Yii::app()->setLanguage($lang); ~~~