เนื้อหาต่อไปนี้จะเป็นแนวทางรูปแบบต่างๆ ที่ใช้ในการจัดรูปแบบวันที่ ซึ่งเป็นรูปแบบที่เรา
กำหนดเอง หรือที่เราใช้งานแล้วมีความสะดวก เข้าใจง่าย แต่ไม่เหมาะสำหรับนำไปใช้งาน
ในการจัดการกับวันที่ร่วมกับข้อมูลอื่น
ตัวอย่างเช่น
1 2 3 4 5 | // 2559-6-14 // 12 11 2560 // 31-1-2559 // 4/7/2016 // 14 มกราคม 2560 |
โดยแนวทางที่จะแนะนำ จะพูดถึงเฉพาะใช้งานกับวันที่ ส่วนการใช้งานร่วมกับเวลา ก็ใช้รูป
แบบเดียวกัน เพียงแค่เพิ่มตัวแปร ในการจัดการเพิ่มเติมเข้าไป
เล่นกับวันที่ ควรใช้รูปแบบมาตรฐาน คือ
0000-00-00 วันที่อย่างเดียว ปี ค.ศ. เดือน และ วัน
0000-00-00 00:00:00 วันที่และเวลา ปี ค.ศ. เดือน และ วัน ชั่วโมง นาที วินาที
ถ้าข้อมูลที่จะใช้งานรูปแบบไม่ตรงตามด้านบน ให้ทำการปรับรูปแบบก่อนนำไปใช้งาน
เพราะถ้ารูปแบบไม่ถูกต้อง เวลามีการแปลงค่าเป็น timestamp ก็จะได้ค่าที่ไม่ถูกต้อง
แนวทางการแยกและจัดรูปแบบข้อความวันที่
เรามาดูว่ามีคำสั่งอะไรบ้าง ที่ใช้จัดการกับข้อความตามที่เราต้องการ
การคัดข้อความ เหมาะกับข้อความที่มีความยาวและตำแหน่งของข้อมูลคงที่ตายตัว เช่น
1 | // 2559-06-14 |
มีความยาวข้อความเท่ากับ 10
เราสามารถใช้ฟังก์ชั่น substr() ได้ดังนี้
1 2 3 4 5 6 7 8 9 | <?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 ; ?> |
การแยกข้อความ เหมาะสำหรับข้อความที่มีตัวแบ่งข้อมูลชัดเจน ลักษณะการแสดงข้อมูลเป็นไปในรูปแบบ
เดียวกัน เช่น
1 2 3 4 5 | // 2559-6-14 // 12 11 2560 // 31-1-2559 // 4/7/2016 // 14 มกราคม 2560 |
เราสามารถใช้ฟังก์ชั่น list() กับ explode() จัดการได้ดังนี้
1 2 3 4 5 6 7 8 9 10 | // $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()
1 2 3 4 5 6 7 | // $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]; |
1 2 | // ซึ่งวิธีข้างต้น เราสามารถใช้คำสั่ง list() แทนได้ ตามที่ได้กล่าวมา ดังนี้ เป็นต้น // list($Y,$m,$d) = explode("-",$strDate); |
เมื่อเราได้ชุดข้อมูล ปี เดือน วัน มาแล้ว จะเห็นว่าบางค่า ก็ยังไม่สามารถนำมาใช้งานได้
ต้องจัดรูปแบบเพิ่มเข้าไปอีก เช่น
ถ้าปีเป็น พ.ศ. ก็ต้องเปลี่ยนเป็น ค.ศ. โดยลบด้วย 543
ถ้าเดือน หรือวันที่ ที่ได้เป็นค่า หลักเดียว เราก็ต้องจัดให้อยู่ในรูปแบบค่า สองหลัก มี 0 นำหน้า
กรณีเป็นค่าหลักเดียว ตัวอย่างเช่น 3 ก็ต้องเป็น 03 เป็นต้น
วิธีการจัดรูปแบบวันที่ หรือเดือนให้มี 0 นำหน้ากรณีมีค่าหลักเดียว สามารถใช้คำสั่ง
str_pad() หรือ sprintf() ได้ ตัวอย่าง
1 2 3 4 5 6 | <?php $m =3; echo str_pad ( $m ,2, "0" ,STR_PAD_LEFT); // 03 // หรือ echo sprintf( "%'.02d" , $m ); // 03 ?> |
โดยค่าที่เป็นหลักเดียวจะถูกเติมเลข 0 เข้าไปด้านหน้า
ส่วนค่าที่มีสองหลักอยู่แล้ว ก็จะไม่เติมเลข 0 ด้านหน้า
แล้วสมมติค่าหลังจากที่แยกมาแล้ว เป็นข้อความ อย่างตัวอย่าง
1 2 | // $strDate= "14 มกราคม 2560"; list( $d , $m , $Y ) = explode ( " " , $strDate ); |
เราจะได้เดือน หรือ $m = "มกราคม" แบบนี้เราจะทำยังไงให้ได้ค่า $m=1 หรือ 01
วิธีการก็คือให้เราสร้างตัวแปร array สำหรับอ้างอิงค่าให้สอดคล้องกันดังนี้
จากนั้นใช้คำสั่ง array_search() หา key ของเดือนที่ตรง มาใช้งาน
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?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()
1 | $strDate_new = implode( "-" , array ( $Y , $m , $d )); |
หรือเชื่อม string ตัวแปร
1 | $strDate_new = "$Y-$m-$d" ; // แบบนี้ก็ได้ |
แนวทางการสร้างฟังก์ชั่นจัดรูปแบบวันที่
ต่อไปเรามาดูแนวทาง ก็สร้างฟังก์ชั่นจัดรูปแบบข้อความ เพื่อเป็นไอเดียหรือวิธีทาง
สมมติ ข้อความเราเป็น
2559-6-14 (*เป็นรูปแบบการจัดเก็บวันที่ที่ไม่แนะนำ)
เราต้องการเปลี่ยนให้เป็น 0000-00-00
แนวทางสร้างโค้ดทดสอบก่อนสร้างฟังก์ชั่น
1 2 3 4 5 6 7 8 9 10 | <?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
การทำงานของฟังก์ชั่นของเราคือ ส่งค่าเข้าไป จัดรูปแบบ และส่งค่ากลับคืนมา
รูปแบบอย่างง่ายคือ
1 2 3 | function mydate( // ตัวแปรที่รับค่า){ return // ตัวแปรที่ส่งค่ากลับ } |
เอาวิธีการจัดรูปแบบมาใส่ในฟังก์ชั่นของเรา
1 2 3 4 5 6 7 8 9 10 11 | 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 // ตัวแปรที่ส่งค่ากลับ } |
ปรับฟังก์ชั่นให้สมบูรณ์
1 2 3 4 5 6 7 8 9 | 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 ; // ตัวแปรที่ส่งค่ากลับ } |
ทดสอบเรียกใช้งานฟังก์ชั่น
1 2 3 4 5 6 | <?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
ยกตัวอย่างการใช้งานและฟักง์ชั่นทีเกี่ยวข้องบางส่วน
จะได้เป็น
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | <?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 ?> |
สามารถนำไปปรับแต่ง ให้กระชับหรือประยุกต์เพิ่มเติมได้