สำหรับผู้ที่อัพเกรดมาใช้ PHP 8.1 เป็นต้นไปจะเจอปัญหาแจ้งเตือนว่า
Deprecated: Function strftime() is deprecated
ซึ่งก็คือแจ้งว่าฟังก์ชั่นนี้เลิกใช้งานแล้วนั่นเอง. strftime()
เป็นหนึ่งในฟังก์ชั่นของ PHP ที่เลิกใช้ โดยทาง PHP แนะนำให้ไปใช้งาน date()
, DateTime::format()
, IntlDateFormatter::format()
แทน. ทั้งที่ยังมีผู้ใช้งานฟังก์ชั่นเดิมนี้อยู่มากแต่ PHP ก็มักจะทำเช่นนี้เป็นประจำตั้งแต่อดีตเรื่อยมา คือประกาศเลิกใช้แล้วก็จะเอาออก ส่งผลให้งานของผู้เขียนโปรแกรมต่างๆต้องชะงักเมื่ออัพเกรดไปสู่ PHP รุ่นใหม่ๆ.
สำหรับทางเลือก ผู้เขียนแนะนำให้ใช้คลาส IntlDateFormatter::format()
เนื่องจากรองรับระบบภาษาได้ดีกว่า. แต่การจะย้ายมาใช้คลาสนี้ การกำหนด pattern จะต่างกันอยู่มาก ดังนั้นจะขอเปรียบเทียบกันด้วยตารางด้านล่างต่อไปนี้ โดยหลักการเปรียบเทียบจะอยู่บน locale ที่เป็นภาษาไทยเป็นหลัก.
strftime() format |
strftime() result |
IntlDateFormatter() pattern |
IntlDateFormatter() result |
---|---|---|---|
%a |
พฤ. | E |
พฤ. |
%A |
พฤหัสบดี | EEEE |
วันพฤหัสบดี |
%d |
09 | dd |
09 |
%e |
9 | d |
9 |
%j |
343 | D |
343 |
%u |
4 | e |
5 |
%w |
4 | c |
5 |
%U |
49 | w |
50 |
%V |
49 | ww |
50 |
%W |
49 | w |
50 |
%b |
ธ.ค. | MMM |
ธ.ค. |
%B |
ธันวาคม | MMMM |
ธันวาคม |
%h |
ธ.ค. | MMM |
ธ.ค. |
%m |
12 | MM |
12 |
%C |
20 | yy |
21 |
%g |
21 | yy |
21 |
%G |
2021 | Y |
2021 |
%y |
21 | yy |
21 |
%Y |
2021 | yyyy |
2021 |
%H |
12 | HH |
12 |
%k |
H |
12 | |
%I |
12 | hh |
12 |
%l |
h |
12 | |
%M |
54 | mm |
54 |
%p |
PM | a |
หลังเที่ยง |
%P |
a |
หลังเที่ยง | |
%r |
12:54:38 | hh:mm:ss a |
12:54:38 หลังเที่ยง |
%R |
12:54 | HH:mm |
12:54 |
%S |
38 | ss |
38 |
%T |
12:54:38 | HH:mm:ss |
12:54:38 |
%X |
12:54:38 | HH:mm:ss |
12:54:38 |
%z |
+0700 | ZZ |
+0700 |
%Z |
SE Asia Standard Time | v |
เวลาไทย |
%c |
9/12/2564 12:54:38 | d/M/YYYY HH:mm:ss |
9/12/2021 12:54:38 |
%D |
12/09/21 | MM/dd/yy |
12/09/21 |
%F |
2021-12-09 | yyyy-MM-dd |
2021-12-09 |
%s |
|
||
%x |
9/12/2564 | d/MM/yyyy |
9/12/2021 |
%n |
(ขึ้นบรรทัดใหม่) |
||
%t |
(แท็บ) |
||
%% |
% | % |
% |
จากตารางจะพบว่าแม้จะทำการเทียบให้ได้ใกล้เคียงที่สุดแต่ก็ไม่สามารถหาค่าที่ได้ผลลัพธ์ออกมาตรงกันได้ทุกอย่าง. (อ้างอิงจาก format ของ strftime()
, pattern ของ IntlDateFormatter()
ซึ่งใช้ pattern ของ ICU).
ผู้อ่านสามารถใช้ source code ของผู้เขียนบน GitHub Gist ไปใช้ในการหาค่าแปลงได้.
เมื่อแปลง pattern มาได้เรียบร้อยแล้ว ให้ใช้โค้ดต่อไปนี้แทนคำสั่ง strftime()
ของเดิม.
$formatter = new \IntlDateFormatter('th', \IntlDateFormatter::FULL, \IntlDateFormatter::FULL);
$formatter->setPattern('EEEE dd MMMM yyyy');// วันที่xx nn ชื่อเดือน ปี
echo $formatter->format(time());
จะได้ผลลัพธ์ตัวอย่างเช่น วันพฤหัสบดี 09 ธันวาคม 2021
หากต้องการแสดงปีเป็นเลข พ.ศ. ด้วย ให้ใส่ \IntlDateFormatter::TRADITIONAL
ตรง argument ที่ 5 ตัวอย่างเช่น.
$formatter = new \IntlDateFormatter('th', \IntlDateFormatter::FULL, \IntlDateFormatter::FULL, null, \IntlDateFormatter::TRADITIONAL);
$formatter->setPattern('EEEE dd MMMM yyyy');
echo $formatter->format(time());
จะได้ผลลัพธ์ตัวอย่างเช่น วันพฤหัสบดี 09 ธันวาคม 2564