เนื้อหาต่อไปนี้จะเป็นแนวทางรูปแบบต่างๆ ที่ใช้ในการจัดรูปแบบวันที่ ซึ่งเป็นรูปแบบที่เรา
กำหนดเอง หรือที่เราใช้งานแล้วมีความสะดวก เข้าใจง่าย แต่ไม่เหมาะสำหรับนำไปใช้งาน
ในการจัดการกับวันที่ร่วมกับข้อมูลอื่น
ตัวอย่างเช่น
// 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 ?>
สามารถนำไปปรับแต่ง ให้กระชับหรือประยุกต์เพิ่มเติมได้