strftime เลิกใช้งานแล้ว

สำหรับผู้ที่อัพเกรดมาใช้ 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

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

คุณอาจใช้แท็กHTMLและแอททริบิวต์เหล่านี้: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>