To display data in a more readable format for users, you may format them using the formatter
application component.
By default the formatter is implemented by yii\i18n\Formatter which provides a set of methods to format data as
date/time, numbers, currencies, and other commonly used formats. You can use the formatter like the following,
$formatter = \Yii::$app->formatter;
// output: January 1, 2014
echo $formatter->asDate('2014-01-01', 'long');
// output: 12.50%
echo $formatter->asPercent(0.125, 2);
// output: <a href="mailto:cebe@example.com">cebe@example.com</a>
echo $formatter->asEmail('cebe@example.com');
// output: Yes
echo $formatter->asBoolean(true);
// it also handles display of null values:
// output: (not set)
echo $formatter->asDate(null);
As you can see, all these methods are named as asXyz()
, where Xyz
stands for a supported format. Alternatively,
you may format data using the generic method format(), which allows you to control
the desired format programmatically and is commonly used by widgets like yii\grid\GridView and yii\widgets\DetailView.
For example,
// output: January 1, 2014
echo Yii::$app->formatter->format('2014-01-01', 'date');
// you can also use an array to specify parameters for the format method:
// `2` is the value for the $decimals parameter of the asPercent()-method.
// output: 12.50%
echo Yii::$app->formatter->format(0.125, ['percent', 2]);
Note: The formatter component is designed to format values to be displayed for the end user. If you want to convert user input into machine readable format, or just format a date in a machine readable format, the formatter is not the right tool for that. To convert user input for date and number values you may use yii\validators\DateValidator and yii\validators\NumberValidator respectively. For simple conversion between machine readable date and time formats, the PHP date()-function is enough.
You may customize the formatting rules by configuring the formatter
component in the application configuration.
For example,
return [
'components' => [
'formatter' => [
'dateFormat' => 'dd.MM.yyyy',
'decimalSeparator' => ',',
'thousandSeparator' => ' ',
'currencyCode' => 'EUR',
],
],
];
Please refer to yii\i18n\Formatter for the properties that may be configured.
The formatter supports the following output formats that are related with date and time:
January 01, 2014
.14:23
.January 01, 2014 14:23
.1412609982
.1 hour ago
.1 day, 2 minutes
.The default date and time formats used for the date, time,
and datetime methods can be customized globally by configuring
dateFormat, timeFormat, and
datetimeFormat.
You can specify date and time formats using the ICU syntax.
You can also use the PHP date() syntax with a prefix php:
to differentiate
it from ICU syntax. For example,
// ICU format
echo Yii::$app->formatter->asDate('now', 'yyyy-MM-dd'); // 2014-10-06
// PHP date()-format
echo Yii::$app->formatter->asDate('now', 'php:Y-m-d'); // 2014-10-06
Info: Some letters of the PHP format syntax are not supported by ICU and thus the PHP intl extension and can not be used in Yii formatter. Most of these (
w
,t
,L
,B
,u
,I
,Z
) are not really useful for formatting dates but rather used when doing date math.S
andU
however may be useful. Their behavior can be achieved by doing the following:
for
S
, which is the English ordinal suffix for the day of the month (e.g. st, nd, rd or th.), the following replacement can be used:
$f = Yii::$app->formatter; $d = $f->asOrdinal($f->asDate('2017-05-15', 'php:j')); echo "On the $d day of the month."; // prints "On the 15th day of the month."
for
U
, the Unix Epoch, you can use the timestamp format.
When working with applications that need to support multiple languages, you often need to specify different date
and time formats for different locales. To simplify this task, you may use format shortcuts (e.g. long
, short
), instead.
The formatter will turn a format shortcut into an appropriate format according to the currently active locale.
The following format shortcuts are supported (the examples assume en_GB
is the active locale):
short
: will output 06/10/2014
for date and 15:58
for time;medium
: will output 6 Oct 2014
and 15:58:42
;long
: will output 6 October 2014
and 15:58:42 GMT
;full
: will output Monday, 6 October 2014
and 15:58:42 GMT
.Since version 2.0.7 it is also possible to format dates in different calendar systems. Please refer to the API documentation of the formatters $calendar-property on how to set a different calendar.
When formatting date and time values, Yii will convert them to the target time zone. The value being formatted is assumed to be in UTC, unless a time zone is explicitly given or you have configured yii\i18n\Formatter::$defaultTimeZone.
In the following examples, we assume the target time zone is set as Europe/Berlin
.
// formatting a UNIX timestamp as a time
echo Yii::$app->formatter->asTime(1412599260); // 14:41:00
// formatting a datetime string (in UTC) as a time
echo Yii::$app->formatter->asTime('2014-10-06 12:41:00'); // 14:41:00
// formatting a datetime string (in CEST) as a time
echo Yii::$app->formatter->asTime('2014-10-06 14:41:00 CEST'); // 14:41:00
If the time zone is not set explicitly on the formatter component, the time zone configured in the application is used, which is the same time zone as set in the PHP configuration.
Note: As time zones are subject to rules made by the governments around the world and may change frequently, it is likely that you do not have the latest information in the time zone database installed on your system. You may refer to the ICU manual for details on updating the time zone database. Please also read Setting up your PHP environment for internationalization.
The formatter supports the following output formats that are related with numbers:
42
.2,542.123
or 2.542,123
.42%
.4.2E4
.£420.00
.
Note that for this function to work properly, the locale needs to include a country part e.g. en_GB
or en_US
because language only
would be ambiguous in this case.410 kibibytes
.410 KiB
.The format for number formatting can be adjusted using the decimalSeparator and thousandSeparator, both of which take default values according to the active locale.
For more advanced configuration, yii\i18n\Formatter::$numberFormatterOptions and yii\i18n\Formatter::$numberFormatterTextOptions can be used to configure the NumberFormatter class used internally to implement the formatter. For example, to adjust the maximum and minimum value of fraction digits, you can configure the yii\i18n\Formatter::$numberFormatterOptions property like the following:
'numberFormatterOptions' => [
NumberFormatter::MIN_FRACTION_DIGITS => 0,
NumberFormatter::MAX_FRACTION_DIGITS => 2,
]
Besides date/time and number formats, Yii also supports other commonly used formats, including
null
values will be formatted using nullDisplay.<p>
tags.['html', ['Attr.AllowedFrameTargets' => ['_blank']]]
.mailto
-link.true
is rendered
as Yes
and false
as No
, translated to the current application language. You can adjust this by configuring
the yii\i18n\Formatter::$booleanFormat property.Null values are specially formatted. Instead of displaying an empty string, the formatter will convert it into a
preset string which defaults to (not set)
translated into the current application language. You can configure the
nullDisplay property to customize this string.
As aforementioned, the formatter may use the currently active locale to determine how to format a value that is suitable in the target country/region. For example, the same date value may be formatted differently for different locales:
Yii::$app->formatter->locale = 'en-US';
echo Yii::$app->formatter->asDate('2014-01-01'); // output: January 1, 2014
Yii::$app->formatter->locale = 'de-DE';
echo Yii::$app->formatter->asDate('2014-01-01'); // output: 1. Januar 2014
Yii::$app->formatter->locale = 'ru-RU';
echo Yii::$app->formatter->asDate('2014-01-01'); // output: 1 января 2014 г.
By default, the currently active locale is determined by the value of yii\base\Application::$language. You may override it by setting the yii\i18n\Formatter::$locale property explicitly.
Note: The Yii formatter relies on the PHP intl extension to support localized data formatting. Because different versions of the ICU library compiled with PHP may cause different formatting results, it is recommended that you use the same ICU version for all your environments. For more details, please refer to Setting up your PHP environment for internationalization.
If the intl extension is not installed, the data will not be localized.
Note that for date values that are before year 1901 or after 2038, they will not be localized on 32-bit systems, even if the intl extension is installed. This is because in this case ICU is using 32-bit UNIX timestamps to date values.
Found a typo or you think this page needs improvement?
Edit it on github !
Signup or Login in order to comment.