ตัวอย่างโค้ด
<?php
function string_convert($my_date) {
$sec = strtotime($my_date);
$my_date = date("Y-m-d H:i", $sec);
$my_date = $my_date . ":00";
echo $my_date;
}
$my_date = "23/11/2020 11:59 PM";
string_convert($my_date);
?>
ผลลัพธ์
1970-01-01 00:00:00
ปัญหาและการแก้ไข
ปัญหา: รูปแบบวันที่ 23/11/2020 11:59 PM ไม่ใช่รูปแบบมาตรฐานที่ strtotime() Parse ได้ถูกต้อง (US Format: mm/dd/yyyy)
แก้ไข: ใช้ DateTime::createFromFormat() ระบุ Format ชัดเจน:
<?php
function string_convert($my_date) {
$dt = DateTime::createFromFormat('d/m/Y h:i A', $my_date);
if ($dt === false) {
echo "Invalid date format";
return;
}
echo $dt->format("Y-m-d H:i:s");
}
$my_date = "23/11/2020 11:59 PM";
string_convert($my_date);
?>
ผลลัพธ์ที่ถูกต้อง
2020-11-23 23:59:00
รูปแบบวันที่ที่ strtotime() รองรับดี
YYYY-MM-DD(ISO 8601)YYYY-MM-DD HH:MM:SSMM/DD/YYYY(US Format)DD-MM-YYYY(European - อาจสับสนกับ US)
Best Practice
- ใช้
DateTime::createFromFormat()สำหรับ Input Formats ที่แน่นอน - เก็บวันที่ใน Database เป็น
DATETIMEหรือTIMESTAMP(UTC) - แสดงผลด้วย
DateTime::format()ตาม Locale ของ User - หลีกเลี่ยง strtotime() กับ Ambiguous Formats