Date Formatter จะทำให้การแปลงข้อมูลวันที่ ให้เป็นเรื่องง่ายๆ ไม่ว่าจะแปลงเป็น วันที หรือเวลา แสดงวันที่แบบย่อๆ หรือแบบยาวๆ ได้หลายแบบ อีกทั้งยังแสดงเวลาตาม language
ที่ได้ตั้งค่าไว้ได้ เช่น th ก็จะแสดงภาษาไทย ถ้าเป็น en-US ก็จะแสดงภาษาอังกฤษ ลองดูตัวอย่างกันครับ
เราสามารถเรียกผ่าน Yii::$app->formatter->as
แล้วต่อด้วย format ที่ต้องการเช่น
Yii::$app->formatter->asDate()
Yii::$app->formatter->asDateTime()
Yii::$app->formatter->asEmail()
Yii::$app->formatter->asUrl()
Yii::$app->formatter->asPercent()
Yii::$app->formatter->asBoolean()
จริงๆ มีเยอะกว่านี้ สามารถดูเพิ่มเติมที่ Class Refferent ได้
ในส่วนตัวอย่างจะเน้นเฉพาะที่เราได้ใช้บ่อยๆ คือ asDate
,asTime
,asDateTime
โดยทั้ง 3 function นี้ มีการรับ parameter 2 ตัว
- ตัวแรกจะรับค่าเป็นวันที่หรือ timestamp ก็ได้ เช่น
time()
,2015-06-23
,2015-06-23 22:00:31
- ตัวที่สองเป็นการระบุ format ที่จะให้มันแสดงผล ซึ่ง ก็มีแบบสำเร็จให้ 4 แบบคือ
short
,medium
,long
,full
และสามารถกำหนด format เองได้ สามารถใช้ได้ 2 แบบคือ
- ICU format สามารถระบุ format ได้เลยเช่น
yyyy-MM-dd
จะได้ค่า2014-10-06
- PHP date()-format ต้องระบุ
php:
นำหน้าเสมอก่อนใส่ format เช่นphp:Y-m-d
จะได้2014-10-06
- ICU format สามารถระบุ format ได้เลยเช่น
เราสามารถเปลี่ยนการแสดงผลเป็นภาษาไทยได้ โดยไปที่ config/main.php เพิ่ม
language=>'th_TH'
เข้าไป ซึ่งโดยปกติค่า default จะเท่ากับen-US
asDate()
เป็นการแปลงข้อมูลให้แสดงผลในรูปแบบเฉพาะวันที่ แม้ว่าค่าที่รับเข้ามาจะมี เวลาอยู่ก็จะแสดงเฉพาะวันที่
ตัวอย่างการเรียกใช้งาน
<?php
$time = time();
Yii::$app->formatter->locale = 'en-US';
echo Yii::$app->formatter->asDate($time, 'short');
echo Yii::$app->formatter->asDate($time, 'medium');
echo Yii::$app->formatter->asDate($time, 'long');
echo Yii::$app->formatter->asDate($time, 'full');
Yii::$app->formatter->locale = 'th_TH';
echo Yii::$app->formatter->asDate($time, 'short');
echo Yii::$app->formatter->asDate($time, 'medium');
echo Yii::$app->formatter->asDate($time, 'long');
echo Yii::$app->formatter->asDate($time, 'full');
// กำหนดเอง
// ICU format
echo Yii::$app->formatter->asDate($time, 'yyyy-MM-dd'); // 2014-10-06
// PHP date()-format
echo Yii::$app->formatter->asDate($time, 'php:Y-m-d'); // 2014-10-06
ICU format ดูที่นี่, PHP date() ดูทีนี่
แสดงผล
6/24/15
Jun 24, 2015
June 24, 2015
Wednesday, June 24, 2015
24/6/2015
24 มิ.ย. 2015
24 มิถุนายน 2015
วันพุธที่ 24 มิถุนายน ค.ศ. 2015
2015-06-24
2015-06-24
asTime()
<?php
Yii::$app->formatter->locale = 'en-US';
echo Yii::$app->formatter->asTime($time, 'short');
echo Yii::$app->formatter->asTime($time, 'medium');
echo Yii::$app->formatter->asTime($time, 'long');
echo Yii::$app->formatter->asTime($time, 'full');
Yii::$app->formatter->locale = 'th_TH';
echo Yii::$app->formatter->asTime($time, 'short');
echo Yii::$app->formatter->asTime($time, 'medium');
echo Yii::$app->formatter->asTime($time, 'long');
echo Yii::$app->formatter->asTime($time, 'full');
// กำหนดเอง
// ICU format
echo Yii::$app->formatter->asDateTime($time, 'kk:mm:ss');
// PHP date()-format
echo Yii::$app->formatter->asDateTime($time, 'php:H:i:s');
แสดงผล
5:32 AM
5:32:54 AM
5:32:54 AM GMT+07:00
5:32:54 AM Indochina Time
5:32
5:32:54
5 นาฬิกา 32 นาที 54 วินาที GMT+07:00
5 นาฬิกา 32 นาที 54 วินาที GMT+07:00
05:32:54
05:32:54
asDateTime()
จะคล้ายกับ adDate แต่เพิ่มเวลาเข้ามา
ตัวอย่างการเรียกใช้งาน
<?php
$time = time();
Yii::$app->formatter->locale = 'en-US';
echo Yii::$app->formatter->asDateTime($time, 'short');
echo Yii::$app->formatter->asDateTime($time, 'medium');
echo Yii::$app->formatter->asDateTime($time, 'long');
echo Yii::$app->formatter->asDateTime($time, 'full');
Yii::$app->formatter->locale = 'th_TH';
echo Yii::$app->formatter->asDateTime($time, 'short');
echo Yii::$app->formatter->asDateTime($time, 'medium');
echo Yii::$app->formatter->asDateTime($time, 'long');
echo Yii::$app->formatter->asDateTime($time, 'full');
// กำหนดเอง
// ICU format
echo Yii::$app->formatter->asDateTime($time, 'yyyy-MM-dd kk:mm:ss');
// PHP date()-format
echo Yii::$app->formatter->asDateTime($time, 'php:Y-m-d H:i:s');
ICU format ดูที่นี่, PHP date() ดูทีนี่
แสดงผล
6/24/15 5:32 AM
Jun 24, 2015 5:32:54 AM
June 24, 2015 5:32:54 AM GMT+07:00
Wednesday, June 24, 2015 5:32:54 AM Indochina Time
24/6/2015, 5:32
24 มิ.ย. 2015, 5:32:54
24 มิถุนายน 2015, 5 นาฬิกา 32 นาที 54 วินาที GMT+07:00
วันพุธที่ 24 มิถุนายน ค.ศ. 2015, 5 นาฬิกา 32 นาที 54 วินาที GMT+07:00
2015-06-24 05:32:54
2015-06-24 05:32:54
ผมตั้งค่า
Yii::$app->formatter->locale
เพราะอยากให้เห็นความแตกต่าง จริงๆ เราตั้งค่าที่ config/main.php ได้ โดยตั้งค่าlanguage => 'th_TH'
ตั้งค่า defaut ให้กับ formatter
ไปที่ config/main.php
//...
'components' => [
'formatter' => [
'dateFormat' => 'dd.MM.yyyy',
'decimalSeparator' => ',',
'thousandSeparator' => ' ',
'currencyCode' => 'EUR',
],
],
หากใช้แล้วยังไม่เปลี่ยนเป็นภาษาไทยให้ลองตั้งค่าที่ php.ini เพื่อเปิด
php_intl
extension=php_intl.dll
[intl]
intl.default_locale =th_TH.UTF-8
; This directive allows you to produce PHP errors when some error
; happens within intl functions. The value is the level of the error produced.
; Default is 0, which does not produce any errors.
;intl.error_level = E_WARNING
ที่มา http://stackoverflow.com/questions/3191664/list-of-all-locales-and-their-short-codes
เพิ่มเติม format อื่นๆ
echo Yii::$app->formatter->asPercent(0.125, 2); // output: 12.50%
echo Yii::$app->formatter->asEmail('cebe@example.com');
แก้ปัญหาเปลี่ยน ค.ศ เป็น พศ
ผมได้สร้างเป็น extension ไว้แล้วนะครับชื่อ yii2-thai-year-formatter ลองติดตั้งใช้งานดู หากพบเจอปัญหาก็แนะนำมาได้เลยนะครับ