Commit 3df51e4c by Qiang Xue

Merge pull request #2155 from dizews/timezone-in-base-formatter

add timeZone into base formatter
parents d8516b17 330ae053
...@@ -104,6 +104,7 @@ Yii Framework 2 Change Log ...@@ -104,6 +104,7 @@ Yii Framework 2 Change Log
- Enh: Added support to parse json request data to Request::getRestParams() (cebe) - Enh: Added support to parse json request data to Request::getRestParams() (cebe)
- Enh: Added ability to get incoming headers (dizews) - Enh: Added ability to get incoming headers (dizews)
- Enh: Added `beforeRun()` and `afterRun()` to `yii\base\Action` (qiangxue) - Enh: Added `beforeRun()` and `afterRun()` to `yii\base\Action` (qiangxue)
- Enh: Added support formatter timeZone by default (dizews)
- Chg #1519: `yii\web\User::loginRequired()` now returns the `Response` object instead of exiting the application (qiangxue) - Chg #1519: `yii\web\User::loginRequired()` now returns the `Response` object instead of exiting the application (qiangxue)
- Chg #1586: `QueryBuilder::buildLikeCondition()` will now escape special characters and use percentage characters by default (qiangxue) - Chg #1586: `QueryBuilder::buildLikeCondition()` will now escape special characters and use percentage characters by default (qiangxue)
- Chg #1610: `Html::activeCheckboxList()` and `Html::activeRadioList()` will submit an empty string if no checkbox/radio is selected (qiangxue) - Chg #1610: `Html::activeCheckboxList()` and `Html::activeRadioList()` will submit an empty string if no checkbox/radio is selected (qiangxue)
......
...@@ -28,6 +28,15 @@ use yii\helpers\Html; ...@@ -28,6 +28,15 @@ use yii\helpers\Html;
class Formatter extends Component class Formatter extends Component
{ {
/** /**
* @var string|\IntlTimeZone|\DateTimeZone the timezone to use for formatting time and date values.
* This can be any value that may be passed to [date_default_timezone_set()](http://www.php.net/manual/en/function.date-default-timezone-set.php)
* e.g. `UTC`, `Europe/Berlin` or `America/Chicago`.
* Refer to the [php manual](http://www.php.net/manual/en/timezones.php) for available timezones.
* This can also be an IntlTimeZone or a DateTimeZone object.
* If not set, [[\yii\base\Application::timezone]] will be used.
*/
public $timeZone;
/**
* @var string the default format string to be used to format a date using PHP date() function. * @var string the default format string to be used to format a date using PHP date() function.
*/ */
public $dateFormat = 'Y/m/d'; public $dateFormat = 'Y/m/d';
...@@ -59,12 +68,20 @@ class Formatter extends Component ...@@ -59,12 +68,20 @@ class Formatter extends Component
*/ */
public $thousandSeparator; public $thousandSeparator;
/** /**
* Initializes the component. * Initializes the component.
*/ */
public function init() public function init()
{ {
if ($this->timeZone === null) {
$this->timeZone = Yii::$app->timeZone;
}
if (is_string($this->timeZone)) {
$this->timeZone = new \DateTimeZone($this->timeZone);
} elseif ($this->timeZone instanceof IntlTimeZone) {
$this->timeZone = $this->timeZone->toDateTimeZone();
}
if (empty($this->booleanFormat)) { if (empty($this->booleanFormat)) {
$this->booleanFormat = [Yii::t('yii', 'No'), Yii::t('yii', 'Yes')]; $this->booleanFormat = [Yii::t('yii', 'No'), Yii::t('yii', 'Yes')];
} }
...@@ -258,7 +275,7 @@ class Formatter extends Component ...@@ -258,7 +275,7 @@ class Formatter extends Component
return $this->nullDisplay; return $this->nullDisplay;
} }
$value = $this->normalizeDatetimeValue($value); $value = $this->normalizeDatetimeValue($value);
return date($format === null ? $this->dateFormat : $format, $value); return $this->formatTimestamp($value, $format === null ? $this->dateFormat : $format, $value);
} }
/** /**
...@@ -282,7 +299,7 @@ class Formatter extends Component ...@@ -282,7 +299,7 @@ class Formatter extends Component
return $this->nullDisplay; return $this->nullDisplay;
} }
$value = $this->normalizeDatetimeValue($value); $value = $this->normalizeDatetimeValue($value);
return date($format === null ? $this->timeFormat : $format, $value); return $this->formatTimestamp($value, $format === null ? $this->timeFormat : $format, $value);
} }
/** /**
...@@ -306,7 +323,7 @@ class Formatter extends Component ...@@ -306,7 +323,7 @@ class Formatter extends Component
return $this->nullDisplay; return $this->nullDisplay;
} }
$value = $this->normalizeDatetimeValue($value); $value = $this->normalizeDatetimeValue($value);
return date($format === null ? $this->datetimeFormat : $format, $value); return $this->formatTimestamp($value, $format === null ? $this->datetimeFormat : $format, $value);
} }
/** /**
...@@ -326,6 +343,19 @@ class Formatter extends Component ...@@ -326,6 +343,19 @@ class Formatter extends Component
} }
/** /**
* @param integer $value normalized datetime value
* @param string $format the format used to convert the value into a date string.
* @return string the formatted result
*/
protected function formatTimestamp($value, $format)
{
$date = new DateTime();
$date->setTimestamp($value);
$date->setTimezone($this->timeZone);
return $date->format($format);
}
/**
* Formats the value as an integer. * Formats the value as an integer.
* @param mixed $value the value to be formatted * @param mixed $value the value to be formatted
* @return string the formatting result. * @return string the formatting result.
......
...@@ -39,15 +39,6 @@ class Formatter extends \yii\base\Formatter ...@@ -39,15 +39,6 @@ class Formatter extends \yii\base\Formatter
*/ */
public $locale; public $locale;
/** /**
* @var string|\IntlTimeZone|\DateTimeZone the timezone to use for formatting time and date values.
* This can be any value that may be passed to [date_default_timezone_set()](http://www.php.net/manual/en/function.date-default-timezone-set.php)
* e.g. `UTC`, `Europe/Berlin` or `America/Chicago`.
* Refer to the [php manual](http://www.php.net/manual/en/timezones.php) for available timezones.
* This can also be an IntlTimeZone or a DateTimeZone object.
* If not set, [[\yii\base\Application::timezone]] will be used.
*/
public $timeZone;
/**
* @var string the default format string to be used to format a date. * @var string the default format string to be used to format a date.
* This can be "short", "medium", "long", or "full", which represents a preset format of different lengths. * This can be "short", "medium", "long", or "full", which represents a preset format of different lengths.
* It can also be a custom format as specified in the [ICU manual](http://userguide.icu-project.org/formatparse/datetime). * It can also be a custom format as specified in the [ICU manual](http://userguide.icu-project.org/formatparse/datetime).
...@@ -98,9 +89,6 @@ class Formatter extends \yii\base\Formatter ...@@ -98,9 +89,6 @@ class Formatter extends \yii\base\Formatter
if ($this->locale === null) { if ($this->locale === null) {
$this->locale = Yii::$app->language; $this->locale = Yii::$app->language;
} }
if ($this->timeZone === null) {
$this->timeZone = Yii::$app->timeZone;
}
if ($this->decimalSeparator === null || $this->thousandSeparator === null) { if ($this->decimalSeparator === null || $this->thousandSeparator === null) {
$formatter = new NumberFormatter($this->locale, NumberFormatter::DECIMAL); $formatter = new NumberFormatter($this->locale, NumberFormatter::DECIMAL);
if ($this->decimalSeparator === null) { if ($this->decimalSeparator === null) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment