เนื้อหาต่อไปนี้จะเป็นแนวทางรูปแบบต่างๆ ที่ใช้ในการจัดรูปแบบวันที่ ซึ่งเป็นรูปแบบที่เรา
กำหนดเอง หรือที่เราใช้งานแล้วมีความสะดวก เข้าใจง่าย แต่ไม่เหมาะสำหรับนำไปใช้งาน
ในการจัดการกับวันที่ร่วมกับข้อมูลอื่น
ตัวอย่างเช่น
// 2559-6-14 // 12 11 2560 // 31-1-2559 // 4/7/2016 // 14 มกราคม 2560
โดยแนวทางที่จะแนะนำ จะพูดถึงเฉพาะใช้งานกับวันที่ ส่วนการใช้งานร่วมกับเวลา ก็ใช้รูป
แบบเดียวกัน เพียงแค่เพิ่มตัวแปร ในการจัดการเพิ่มเติมเข้าไป
เล่นกับวันที่ ควรใช้รูปแบบมาตรฐาน คือ
0000-00-00 วันที่อย่างเดียว ปี ค.ศ. เดือน และ วัน
0000-00-00 00:00:00 วันที่และเวลา ปี ค.ศ. เดือน และ วัน ชั่วโมง นาที วินาที
ถ้าข้อมูลที่จะใช้งานรูปแบบไม่ตรงตามด้านบน ให้ทำการปรับรูปแบบก่อนนำไปใช้งาน
เพราะถ้ารูปแบบไม่ถูกต้อง เวลามีการแปลงค่าเป็น timestamp ก็จะได้ค่าที่ไม่ถูกต้อง
แนวทางการแยกและจัดรูปแบบข้อความวันที่
เรามาดูว่ามีคำสั่งอะไรบ้าง ที่ใช้จัดการกับข้อความตามที่เราต้องการ
การคัดข้อความ เหมาะกับข้อความที่มีความยาวและตำแหน่งของข้อมูลคงที่ตายตัว เช่น
// 2559-06-14
มีความยาวข้อความเท่ากับ 10
เราสามารถใช้ฟังก์ชั่น substr() ได้ดังนี้
<?php
$strDate = "2559-06-14";
$Y = substr($strDate,0,4);
$Y = $Y-543;
$m = substr($strDate,5,2);
$d = substr($strDate,8,2);
$strDate_new = implode("-",array($Y,$m,$d));
echo $strDate_new;
?>
การแยกข้อความ เหมาะสำหรับข้อความที่มีตัวแบ่งข้อมูลชัดเจน ลักษณะการแสดงข้อมูลเป็นไปในรูปแบบ
เดียวกัน เช่น
// 2559-6-14 // 12 11 2560 // 31-1-2559 // 4/7/2016 // 14 มกราคม 2560
เราสามารถใช้ฟังก์ชั่น list() กับ explode() จัดการได้ดังนี้
// $strDate= "2559-6-14";
list($Y,$m,$d) = explode("-",$strDate);
// $strDate= "12 11 2560";
list($d,$m,$Y) = explode(" ",$strDate);
// $strDate= "31-1-2559";
list($d,$m,$Y) = explode("-",$strDate);
// $strDate= "4/7/2016";
list($d,$m,$Y) = explode("/",$strDate);
// $strDate= "14 มกราคม 2560";
list($d,$m,$Y) = explode(" ",$strDate);
คำสั่ง explode() เราจะใช้แยกข้อความตามตัวแบ่งที่เรากำหนด เป็นค่า array
แล้วใช้คำสั่ง list() กำหนดตัวแปรไปรับค่า array แต่ละตัว ตามตำแหน่งที่ต้องการ
ขอยกตัวอย่างบางตัว มาอธิบายขยายให้เห็นภาพ การใช้ค่า array จากคำสั่ง explode()
// $strDate= "2559-6-14";
$arr_data = explode("-",$strDate); // แยกข้อความเป็น array ไว้ในตัวแปร $arr_data
// จากรูปแบบวันที่ และตัวแบ่งที่กำหนด เราจะได้ตัวแปร $arr_data มีสมาชิก 3 ค่า
// มี key เริ่มต้นที่ 0 และเราสามารถนำค่า array แต่ละค่าไปกำหนดให้กับตัวแปรตามต้องการได้
$Y = $arr_data[0];
$m = $arr_data[1];
$d = $arr_data[2];
// ซึ่งวิธีข้างต้น เราสามารถใช้คำสั่ง list() แทนได้ ตามที่ได้กล่าวมา ดังนี้ เป็นต้น
// list($Y,$m,$d) = explode("-",$strDate);
เมื่อเราได้ชุดข้อมูล ปี เดือน วัน มาแล้ว จะเห็นว่าบางค่า ก็ยังไม่สามารถนำมาใช้งานได้
ต้องจัดรูปแบบเพิ่มเข้าไปอีก เช่น
ถ้าปีเป็น พ.ศ. ก็ต้องเปลี่ยนเป็น ค.ศ. โดยลบด้วย 543
ถ้าเดือน หรือวันที่ ที่ได้เป็นค่า หลักเดียว เราก็ต้องจัดให้อยู่ในรูปแบบค่า สองหลัก มี 0 นำหน้า
กรณีเป็นค่าหลักเดียว ตัวอย่างเช่น 3 ก็ต้องเป็น 03 เป็นต้น
วิธีการจัดรูปแบบวันที่ หรือเดือนให้มี 0 นำหน้ากรณีมีค่าหลักเดียว สามารถใช้คำสั่ง
str_pad() หรือ sprintf() ได้ ตัวอย่าง
<?php
$m=3;
echo str_pad($m,2,"0",STR_PAD_LEFT); // 03
// หรือ
echo sprintf("%'.02d",$m); // 03
?>
โดยค่าที่เป็นหลักเดียวจะถูกเติมเลข 0 เข้าไปด้านหน้า
ส่วนค่าที่มีสองหลักอยู่แล้ว ก็จะไม่เติมเลข 0 ด้านหน้า
แล้วสมมติค่าหลังจากที่แยกมาแล้ว เป็นข้อความ อย่างตัวอย่าง
// $strDate= "14 มกราคม 2560";
list($d,$m,$Y) = explode(" ",$strDate);
เราจะได้เดือน หรือ $m = "มกราคม" แบบนี้เราจะทำยังไงให้ได้ค่า $m=1 หรือ 01
วิธีการก็คือให้เราสร้างตัวแปร array สำหรับอ้างอิงค่าให้สอดคล้องกันดังนี้
จากนั้นใช้คำสั่ง array_search() หา key ของเดือนที่ตรง มาใช้งาน
<?php
// สมมติตัวแปร array เก็บเดือนภาษาไทยของเรามีลักษณะดังนี้
$thai_month_arr=array(
"0"=>"",
"1"=>"มกราคม",
"2"=>"กุมภาพันธ์",
"3"=>"มีนาคม",
"4"=>"เมษายน",
"5"=>"พฤษภาคม",
"6"=>"มิถุนายน",
"7"=>"กรกฎาคม",
"8"=>"สิงหาคม",
"9"=>"กันยายน",
"10"=>"ตุลาคม",
"11"=>"พฤศจิกายน",
"12"=>"ธันวาคม"
);
$m="มกราคม";
$m = array_search($m, $thai_month_arr);// ค้นหา "มกราคม" ในตัวแปร $thai_month_arr
// แล้วคืนค่าเป็น key ของ array ที่มีค่าตรงกับข้อความที่เราค้นหา
echo $m; // เราจะได้ $m เท่ากับ 1 สามารถนำไปจัดรูปแบบโดยเติม 0 ด้านหน้าต่อได้
?>
เมื่อเราได้ค่าแต่ละส่วนแล้วต่อไปก็นำค่านั้นมารวมกัน หรือเชื่อมกันโดยใช้ตัวแบ่งเป็น (-)
เพื่อให้รูปแบบวันที่อยู่ในรูปแบบมาตรฐาน 0000-00-00
ซึ่งสามารถทำได้หลายวิธี เช่น
ใช้คำสั่ง implode()
$strDate_new = implode("-",array($Y,$m,$d));
หรือเชื่อม string ตัวแปร
$strDate_new = "$Y-$m-$d"; // แบบนี้ก็ได้
แนวทางการสร้างฟังก์ชั่นจัดรูปแบบวันที่
ต่อไปเรามาดูแนวทาง ก็สร้างฟังก์ชั่นจัดรูปแบบข้อความ เพื่อเป็นไอเดียหรือวิธีทาง
สมมติ ข้อความเราเป็น
2559-6-14 (*เป็นรูปแบบการจัดเก็บวันที่ที่ไม่แนะนำ)
เราต้องการเปลี่ยนให้เป็น 0000-00-00
แนวทางสร้างโค้ดทดสอบก่อนสร้างฟังก์ชั่น
<?php
$strDate = "2559-6-14";
list($Y,$m,$d) = explode("-",$strDate); // แยกข้อความด้วยตัวแบ่ง
$Y = $Y-543; // จัดรูปแบบปีเป็น ค.ศ. ลบ 543
$m = sprintf("%'.02d",$m); // จัดรูปแบบเดือน 00
$d = sprintf("%'.02d",$d); // จัดรูปแบบวัน 00
$strDate_new = implode("-",array($Y,$m,$d));
// $strDate_new = "$Y-$m-$d"; // แบบนี้ก็ได้
echo $strDate_new; // จะได้เป็น 2016-06-14
?>
จากวิธีการจัดรูปแบบที่เราได้ ต่อไปก็สร้างฟังก์ชั่น เช่นฟังก์ชั่นเราชื่อ mydate
การทำงานของฟังก์ชั่นของเราคือ ส่งค่าเข้าไป จัดรูปแบบ และส่งค่ากลับคืนมา
รูปแบบอย่างง่ายคือ
function mydate(// ตัวแปรที่รับค่า){
return // ตัวแปรที่ส่งค่ากลับ
}
เอาวิธีการจัดรูปแบบมาใส่ในฟังก์ชั่นของเรา
function mydate(// ตัวแปรที่รับค่า){
$strDate = "2559-6-14";
list($Y,$m,$d) = explode("-",$strDate); // แยกข้อความด้วยตัวแบ่ง
$Y = $Y-543; // จัดรูปแบบปีเป็น ค.ศ. ลบ 543
$m = sprintf("%'.02d",$m); // จัดรูปแบบเดือน 00
$d = sprintf("%'.02d",$d); // จัดรูปแบบวัน 00
$strDate_new = implode("-",array($Y,$m,$d));
// $strDate_new = "$Y-$m-$d"; // แบบนี้ก็ได้
echo $strDate_new; // จะได้เป็น 2016-06-14
return // ตัวแปรที่ส่งค่ากลับ
}
ปรับฟังก์ชั่นให้สมบูรณ์
function mydate($strDate){
list($Y,$m,$d) = explode("-",$strDate); // แยกข้อความด้วยตัวแบ่ง
$Y = $Y-543; // จัดรูปแบบปีเป็น ค.ศ. ลบ 543
$m = sprintf("%'.02d",$m); // จัดรูปแบบเดือน 00
$d = sprintf("%'.02d",$d); // จัดรูปแบบวัน 00
$strDate_new = implode("-",array($Y,$m,$d));
// $strDate_new = "$Y-$m-$d"; // แบบนี้ก็ได้
return $strDate_new; // ตัวแปรที่ส่งค่ากลับ
}
ทดสอบเรียกใช้งานฟังก์ชั่น
<?php
echo mydate("2560-3-8"); // จะได้ค่าเป็น 2017-03-08
// หรือถ้าใช้ค่าจากตัวแปร ก็จะได้เป็น
$my_strDate="2560-3-8";
echo mydate($my_strDate); // จะได้ค่าเป็น 2017-03-08
?>
เราก็ได้รูปแบบฟังก์ชั่นจัดรูปแบบวันที่ให้เป็นมาตรฐานพร้อมนำไปประยุกต์ใช้งาน
สมมติเราประยุกต์ใช้งาน กับฟังก์ชั่น แสดงวันที่ ภาษาไทย ตามบทความด้านล่างนี้
สร้างฟังก์ชั่น แสดงวันที่ ภาษาไทย ด้วย php อย่างง่าย
https://www.ninenik.com/content.php?arti_id=459 via @ninenik
ยกตัวอย่างการใช้งานและฟักง์ชั่นทีเกี่ยวข้องบางส่วน
จะได้เป็น
<?php
$thai_month_arr=array(
"0"=>"",
"1"=>"มกราคม",
"2"=>"กุมภาพันธ์",
"3"=>"มีนาคม",
"4"=>"เมษายน",
"5"=>"พฤษภาคม",
"6"=>"มิถุนายน",
"7"=>"กรกฎาคม",
"8"=>"สิงหาคม",
"9"=>"กันยายน",
"10"=>"ตุลาคม",
"11"=>"พฤศจิกายน",
"12"=>"ธันวาคม"
);
function thai_date_and_time($time){ // 19 ธันวาคม 2556 เวลา 10:10:43
global $thai_month_arr;
$thai_date_return=date("j",$time);
$thai_date_return.=" ".$thai_month_arr[date("n",$time)];
$thai_date_return.= " ".(date("Y",$time)+543);
$thai_date_return.= " เวลา ".date("H:i:s",$time);
return $thai_date_return;
}
function mydate($strDate){
list($Y,$m,$d) = explode("-",$strDate); // แยกข้อความด้วยตัวแบ่ง
$Y = $Y-543; // จัดรูปแบบปีเป็น ค.ศ. ลบ 543
$m = sprintf("%'.02d",$m); // จัดรูปแบบเดือน 00
$d = sprintf("%'.02d",$d); // จัดรูปแบบวัน 00
$strDate_new = implode("-",array($Y,$m,$d));
// $strDate_new = "$Y-$m-$d"; // แบบนี้ก็ได้
return $strDate_new; // ตัวแปรที่ส่งค่ากลับ
}
?>
<?php
//////////// การใช้งาน
$my_strDate="2560-3-8";
$strDate=mydate($my_strDate);
echo thai_date_and_time(strtotime($strDate)); // 8 มีนาคม 2560 เวลา 10:10:43
?>
สามารถนำไปปรับแต่ง ให้กระชับหรือประยุกต์เพิ่มเติมได้