เนื้อหานี้จะเป็นแนวทางการใช้งานรูปแบบวันที่และเวลาที่เป็นข้อความ เพื่อประยุกต์ใช้งานเกี่ยวกับ
วันที่และเวลาที่ต้องการ ตัวอย่างเช่น วันอังคารหน้าวันที่เท่าไหร่ เสาร์ที่สองของเดือนมกราคมคือวันที่เท่าไหร่
เหล่านี้เป็นต้น
โดยแนะนำว่าเนื้อหาในตอนนี้ เป็นทางเลือกสำหรับจัดการเกี่ยวกับวันที่และเวลาที่ซับซ้อน เลือกนำไปใช้
ถ้าเห็นว่ามีประโยชน์ โดยไม่ต้องจำสัญลักษณ์ทั้งหมดก็ได้ แต่ใหัรู้ว่ามีวิธีเหล่านี้อยู่ ซึ่งถ้าหากต้องการใช้งาน
ก็สามารถกลับมาดูเนื้อหาในบทความนี้เป็นแนวทางได้ ซึ่งเท่าที่ดูแล้ว บางรูปแบบคำสั่งอาจจะไม่จำเป็น
บางคำสั่งก็น่าสนใจ ลองอ่านรายละเอียดกันดู
ดูต้นฉบับอ้างอิงได้ที่ http://php.net/manual/en/datetime.formats.relative.php
ก่อนอื่นมาดูตารางสัญลักษณ์ต่างๆ ที่เราจะใช้ในการนำไปจัดรูปแบบข้อความวันที่ ไม่ว่าจะเป็น ชื่อวัน
ชื่อวันแบบย่อ เครื่องหมาย +/- เป็นต้น
สัญลักษณ์ที่ใช้งานรูปแบบข้อความวันที่ใน php แสดงในตารางได้ดังนี้
คำอธิบาย | รูปแบบ |
---|---|
ชื่อวัน ได้ทั้งแบบเต็ม และ แบบย่อ |
'sunday' | 'monday' | 'tuesday' | 'wednesday' | 'thursday' |
'friday' | 'saturday' | 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat' |
ข้อความแสดงวันปกติ ไม่ใช่ เสาร์ อาทิตย์ |
'weekday' | 'weekdays' |
ตัวเลข อาจมีค่า + หรือ - ด้านหน้า แล้วแต่กรณี |
[+-]?[0-9]+ |
ข้อความแสดงลำดับที่ | 'first' | 'second' | 'third' | 'fourth' | 'fifth' | 'sixth' |
'seventh' | 'eighth' | 'ninth' | 'tenth' | 'eleventh' | 'twelfth' | 'next' | 'last' | 'previous' | 'this' |
ข้อความแสดงความสัมพันธ์ เช่น ถัดไป ก่อนหน้า วันนี้ |
'next' | 'last' | 'previous' | 'this' |
ช่องว่าง กรณีมีการเชื่อมข้อความ | [ \t]+ |
หน่วยเวลา | (('sec' | 'second' | 'min' | 'minute' | 'hour' | 'day' |
'fortnight' | 'forthnight' | 'month' | 'year') 's'?) | 'weeks' | หรือ ข้อความแสดงวันปกติ ( 'weekday' | 'weekdays' ) |
ประยุกต์การใช้งานคำอธิบายวันที่และเวลากับฟังก์ชั่นคำสั่ง strtotime()
รูปแบบข้อความ
"yesterday"
ใช้แสดงวันที่และเวลาของวันเมื่อวาน
ตัวอย่างการใช้งาน
<?php // สมมติวันนี้เป็นวันที่ 2017-06-02 echo date("Y-m-d H:i:s",strtotime("yesterday"))."<br>"; // 2017-06-01 00:00:00 // กรณีต้องการกำหนดเวลาไปด้วยก็สามารถทำได้ดังนี้ echo date("Y-m-d H:i:s",strtotime("yesterday 15:00"))."<br>"; // 2017-06-01 15:00:00 ?>
รูปแบบข้อความ
"tomorrow"
ใช้แสดงวันที่และเวลาของวันพรุ่งนี้
ตัวอย่างการใช้งาน
<?php // สมมติวันนี้เป็นวันที่ 2017-06-02 echo date("Y-m-d H:i:s",strtotime("tomorrow"))."<br>"; // 2017-06-03 00:00:00 // กรณีต้องการกำหนดเวลาไปด้วยก็สามารถทำได้ดังนี้ echo date("Y-m-d H:i:s",strtotime("tomorrow 15:00"))."<br>"; // 2017-06-03 15:00:00 ?>
รูปแบบข้อความ
"midnight" กับ "today" กับ "now"
ใช้แสดงวันที่และเวลาของวันปัจจุบัน
ตัวอย่างการใช้งาน
<?php // สมมติวันนี้เป็นวันที่ 2017-06-02 echo date("Y-m-d H:i:s",strtotime("now"))."<br>"; // 2017-06-02 04:18:28 // now ใช้แสดงวันที่และเวลาปัจจุบัน ต่างจาก midnight และ today ที่เซ็ตเวลาเป็น 00:00:00 echo date("Y-m-d H:i:s",strtotime("midnight"))."<br>"; // 2017-06-02 00:00:00 echo date("Y-m-d H:i:s",strtotime("today"))."<br>"; // 2017-06-02 00:00:00 // กรณี today สามารถทำการกำหนดเวลาไปด้วยได้ดังนี้ echo date("Y-m-d H:i:s",strtotime("today 12:11"))."<br>"; // 2017-06-02 12:11:00 ?>
รูปแบบข้อความ
"noon"
ใช้แสดงเวลาเที่ยงตรง หรือ 12:00:00 ของวันนั้นๆ
ตัวอย่างการใช้งาน
<?php // สมมติวันนี้เป็นวันที่ 2017-06-02 echo date("Y-m-d H:i:s",strtotime("noon"))."<br>"; // 2017-06-02 12:00:00 // กรณีต้องการกำหนดวันที่ไปด้วยก็สามารถทำได้ดังนี้ echo date("Y-m-d H:i:s",strtotime("2017-06-03 noon"))."<br>"; // 2017-06-03 12:00:00 // สามารถใช้รวมกับรูปแบบข้อความวันที่อื่นๆ เช่น "yesterday noon" echo date("Y-m-d H:i:s",strtotime("yesterday noon"))."<br>"; // 2017-06-01 12:00:00 echo date("Y-m-d H:i:s",strtotime("tomorrow noon"))."<br>"; // 2017-06-03 12:00:00 ?>
รูปแบบข้อความ
"ใช้ชื่อวัน" ตามสัญลักษณ์รูปแบบวันที่ตามตารางด้านบน
ใช้แสดงวันที่ของวันที่กำหนด โดยนับไปข้างหน้า เช่น สมมติ วันนี้วันศุกร์ "Friday"
ถ้าเรากำหนดชื่อวันเป็น "Monday" ก็จะหมายถึง วันจันทร์ที่จะถึง ไม่ใช่วันจันทร์ที่ผ่านมา
และถ้ากำหนดเป็นชื่อวันปัจจุบัน ก็จะหมายถึงวันที่ ของวันนั้นๆ เช่น กำหนดชื่อวันเป็น "Friday"
ก็จะหมายถึงวันศุกร์วันนี้ ไม่ใช้วันศุกร์หน้า เป็นต้น
ตัวอย่างการใช้งาน
<?php // สมมติวันนี้เป็นวันที่ 2017-06-02 echo date("Y-m-d H:i:s",strtotime("Monday"))."<br>"; // 2017-06-05 00:00:00 echo date("Y-m-d H:i:s",strtotime("Mon 15:10"))."<br>"; // 2017-06-05 15:10:00 echo date("Y-m-d H:i:s",strtotime("Fri 15:10"))."<br>"; // 2017-06-02 15:10:00 ?>
รูปแบบข้อความ
ข้อความสัมพันธ์วันที่ เว้นวรรค ตามด้วย "week"
ใช้แสดงของวันที่และเวลาให้สัมพันธ์กับข้อความโดยอ้างอิงกับสัปดาห์ เช่น
หาวันที่ของวันจันทร์สัปดาห์หน้า
ตัวอย่างการใช้งาน
<?php // สมมติวันนี้เป็นวันที่ 2017-06-02 echo date("Y-m-d H:i:s",strtotime("Monday next week"))."<br>"; // 2017-06-05 00:00:00 echo date("Y-m-d H:i:s",strtotime("Saturday next week"))."<br>"; // 2017-06-10 00:00:00 // กรณีกำหนดเวลาสามารถ กำหนดได้เป็น echo date("Y-m-d H:i:s",strtotime("Saturday next week 13:20"))."<br>"; // 2017-06-10 13:20:00 echo date("Y-m-d H:i:s",strtotime("Saturday this week 13:20"))."<br>"; // 2017-06-03 13:20:00 ?>
รูปแบบข้อความ
ข้อความเลขลำดับที่ เว้นวรรค ตามด้วยหน่วยเวลา
ใช้แสดงของวันที่และเวลาที่สัมพันธ์กับข้อความ นับจากปัจจุบัน
ตัวอย่างการใช้งาน
<?php // สมมติวันนี้เป็นวันที่ 2017-06-02 echo date("Y-m-d H:i:s",strtotime("first day"))."<br>"; // 2017-06-03 16:36:41 echo date("Y-m-d H:i:s",strtotime("second month"))."<br>"; // 2017-08-02 16:36:41 // กรณีกำหนดเวลาสามารถ กำหนดได้เป็น echo date("Y-m-d H:i:s",strtotime("first day 11:10"))."<br>"; // 2017-06-03 11:10:00 ?>
รูปแบบข้อความ
+/- ตัวเลขจำนวน เว้นวรรค ตามด้วยหน่วยเวลา หรือ "week"
ใช้แสดงของวันที่และเวลาที่สัมพันธ์กับค่าตัวเลขที่นำมาบวกเพิ่ม หรือลดลง นับจากปัจจุบัน
ตัวอย่างการใช้งาน
<?php // สมมติวันนี้เป็นวันที่ 2017-06-02 echo date("Y-m-d H:i:s",strtotime("1 day"))."<br>"; // 2017-06-03 16:43:47 echo date("Y-m-d H:i:s",strtotime("+1 day"))."<br>";// 2017-06-03 16:43:47 echo date("Y-m-d H:i:s",strtotime("-1 day"))."<br>";// 2017-06-01 16:43:47 // ย้อนหลังนับเฉพาะวันธรรมดา ด้วย weekdays (ไม่นับเสาร์ อาทิตย์) echo date("Y-m-d H:i:s",strtotime("-2 weekdays"))."<br>"; // 2017-05-31 00:00:00 // นับไปอีก 1 สัปดาห์คือวันที่อะไร echo date("Y-m-d H:i:s",strtotime("+1 weeks"))."<br>"; // 2017-06-09 16:43:47 ?>
รูปแบบข้อความ
"ago"
ใช้แสดงของวันที่และเวลาที่ผ่านมา โดยสัมพันธ์กับรายการวันที่และเวลาที่เกี่ยวข้อง
ตัวอย่างการใช้งาน
<?php // สมมติวันนี้เป็นวันที่ 2017-06-02 echo date("Y-m-d H:i:s",strtotime("2 days ago"))."<br>"; // 2017-05-31 16:43:47 // จะคล้ายกับ "-2 days" // ตัวอย่างเพิ่มเติม // "8 days ago 14:00", "2 months 5 days ago", "2 months ago 5 days", "2 days ago" ?>
รูปแบบข้อความ
"back of" เว้นวรรค ตามด้วยชั่วโมงที่กำหนด
ใช้แสดงวันที่และเวลาในอีก 15 นาที่ ต่อมา ของชั่วโมงที่กำหนด
"front of" เว้นวรรค ตามด้วยชั่วโมงที่กำหนด
ใช้แสดงวันที่และเวลาก่อนชั่วโมงที่กำหนด 15 นาที่
ตัวอย่างการใช้งาน
<?php // สมมติวันนี้เป็นวันที่ 2017-06-02 echo date("Y-m-d H:i:s",strtotime("back of 7pm"))."<br>"; // 2017-06-02 19:15:00 // 7pm คือ 19 นาฬิกา ดังนั้น 15 นาทีต่อมาของ 19:00 คือ 19:15 echo date("Y-m-d H:i:s",strtotime("back of 15"))."<br>"; // 2017-06-02 15:15:00 echo date("Y-m-d H:i:s",strtotime("front of 5am"))."<br>"; // 2017-06-02 04:45:00 // 5am คือ 5 นาฬิกา ดังนั้น 15 นาทีก่อนเวลา 05:00 คือ 04:45 echo date("Y-m-d H:i:s",strtotime("front of 23"))."<br>"; // 2017-06-02 22:45:00 ?>
รูปแบบข้อความ
"first day of" เว้นวรรค ตามด้วยชื่อเดือน ปี(ถ้ามี) หรือ ตามด้วย ข้อความที่สัมพันธ์กับเดือน
ใช้แสดงวันที่แรกของเดือนที่เรากำหนด ปกติก็จะได้วันที่ 1 แต่จะเป็นเวลาที่ 00:00:00
ถ้าเป็นการระบุเดือน หรือปี และเวลาเป็นเวลาปัจจุบัน ณ ขณะนั้น ถ้าระบุกับข้อความที่สัมพันธ์กับเดือน
"last day of" เว้นวรรค ตามด้วยชื่อเดือน ปี(ถ้ามี) หรือ ตามด้วย ข้อความที่สัมพันธ์กับเดือน
ใช้แสดงวันที่สุดท้ายของเดือนที่เรากำหนด ปกติจะเป็นค่าตามจำนวนวันของเดือนนั้นๆ
แต่จะเป็นเวลาที่ 00:00:00 ถ้าเป็นการระบุเดือน หรือปี
และเวลาเป็นเวลาปัจจุบัน ณ ขณะนั้น ถ้าระบุกับข้อความที่สัมพันธ์กับเดือน
ตัวอย่างการใช้งาน
<?php // สมมติวันนี้เป็นวันที่ 2017-06-02 echo date("Y-m-d H:i:s",strtotime("first day of June 2017"))."<br>"; // 2017-06-01 00:00:00 echo date("Y-m-d H:i:s",strtotime("first day of next month"))."<br>"; // 2017-07-01 16:43:47 echo date("Y-m-d H:i:s",strtotime("last day of June 2017"))."<br>"; // 2017-06-30 00:00:00 echo date("Y-m-d H:i:s",strtotime("last day of next month"))."<br>"; // 2017-07-31 16:43:47 ?>
รูปแบบข้อความ
ข้อความแสดงลำดับที่ เว้นวรรค ตามด้วยชื่อวัน เว้นวรรค ตามด้วย "of" ตามด้วยชื่อเดือน ปี(ถ้ามี) หรือ ตามด้วย ข้อความที่สัมพันธ์กับเดือน
ใช้คำนวณหาวันที่และเวลาของวัน ในสัปดาห์ที่กำหนดของเดือนนั้น หรือเดือนที่ระบุ ตามความสัมพันธ์
โดยเวลาจะเป็นเวลาที่ 00:00:00
"last" เว้นวรรค ตามด้วยชื่อวัน เว้นวรรค ตามด้วย "of" ตามด้วยชื่อเดือน ปี(ถ้ามี) หรือ ตามด้วย ข้อความที่สัมพันธ์กับเดือน
ใช้คำนวณหาวันที่และเวลาของวัน ในสัปดาห์สุดท้ายของเดือนนั้น หรือเดือนที่ระบุ ตามความสัมพันธ์
โดยเวลาจะเป็นเวลาที่ 00:00:00
ตัวอย่างการใช้งาน
<?php // สมมติวันนี้เป็นวันที่ 2017-06-02 echo date("Y-m-d H:i:s",strtotime("first sat of June 2017"))."<br>"; // 2017-06-03 00:00:00 echo date("Y-m-d H:i:s",strtotime("first sat of next month"))."<br>"; // 2017-07-01 00:00:00 echo date("Y-m-d H:i:s",strtotime("last sat of June 2017"))."<br>"; // 2017-06-24 00:00:00 echo date("Y-m-d H:i:s",strtotime("last sat of next month"))."<br>"; // 2017-07-29 00:00:00 ?>
ทั้งหมดคือรูปแบบข้อความเกี่ยวกับวันที่ และการใช้งาน รวมถึงการประยุกต์ใช้งานร่วมกับ strtotime() และ
date() โดยคำสั่ง
strtotime() จะใช้แปลงข้อความเกี่ยวกับวันที่เวลา ให้อยู่ในรูปแบบเวลา timestamp ซึ่งเป็น number
ที่เราสามารถนำไปใช้ในการเปรียบเทียบเวลา ได้
date() เป็นคำสั่งในการจัดรูปแบบการแสดงวันที่และเวลาให้อยู่ในรูปแบบที่เราต้องการ โดยรูปแบบมาตรฐาน
ที่เราคุ้น จะอยู่ในรูปแบบ 0000-00-00 00:00:00 ดังนั้นเวลาเราใช้งานวันที่ใน ฐานข้อมูล ควรกำหนด type
ของฟิลด์ที่เก็บวันที่และเวลา ให้อยู่ในรูปแบบ date หรือ datetime จะทำให้สะดวกกว่าเก็บในรูปแบบ varchar
ขอนำคำตอบในกระทู้คำถาม มาเสริมในบทความนี้
เป็นการตอบเกี่ยวกับการเทียบช่วงเวลา โดยใช้ strtotime()
ข้อมูลจากคำตอบที่ https://www.ninenik.com/forum_view_2460_1.html#comment_5740
การเปรียบเทียบวันที่ใน php น่าจะต้องใช้ค่าวันที่ที่อยู่ในรูปแบบตัวเลข หรือที่เรียกว่า timestamp
ค่าวันที่และเวลาปัจจุบัน ได้จากฟังก์ชั่น time()
ค่าวันที่และเวลาจาก ข้อความวันที่ ได้จากใช้งานฟังก์ชั่น strtotime() หรือ mktime()
<?php $date1="2017-05-31"; $date2="2017-05-31 15:00"; $date3="2017-05-31 15:00:01"; echo strtotime($date1)."<br>"; echo strtotime($date2)."<br>"; echo strtotime($date3)."<br>"; ?>
สมมติเราต้องการหาว่า วันที่หรือเวลาที่ส่งมา มากกว่าหรือน้อยกว่าวันที่ปัจจุบัน
ก็จะได้เป็น
if(strtotime($date1)<time()){ echo "Yes"; }
กรณีเปรียบเทียบกับช่วงเวลา 2017-05-30 07:30 - 2017-05-30 19:00
เช่น เวลาในขณะนี้ อยู่ในช่วงเวลาที่กำหนดหรือไม่
$date_start1="2017-05-30 07:30"; $date_end1="2017-05-30 19:00"; if(time()>=strtotime($date_start1) && time()<=strtotime($date_end1)){ echo "Yes"; }
หรือสมมติช่วงเวลาสิ้นสุดอย่าง $date_end1 มีค่าเพิ่มขึ้นในสัดส่วนคงที่ เราก็สามารถใช้วิธีการบวกค่า
แล้วใช้ฟังก์ัช่น strtotime() แปลงค่าอีกทีก็ได้ เช่น
$date_start1="2017-05-30 07:30"; $date_end1=date("Y-m-d H:i",strtotime($date_start1." +11 hour +30 minute")); // $date_end1 เราจะได้มีค่าเท่ากับ 2017-05-30 19:00 if(time()>=strtotime($date_start1) && time()<=strtotime($date_end1)){ echo "Yes"; }
แนวทางข้างต้น ใช้ได้กับกรณีเป็นเงื่อนไขข้ามวัน อย่างตัวอย่างช่วงที่ 2
2017-05-30 19:30 - 2017-05-31 07:00
$date_start2="2017-05-30 19:30"; $date_end2=date("Y-m-d H:i",strtotime($date_start2." +11 hour +30 minute")); // $date_end2 เราจะได้มีค่าเท่ากับ 2017-05-31 07:00 echo $date_end2."<br>"; if(time()>=strtotime($date_start2) && time()<=strtotime($date_end2)){ echo "Yes"; }
เวลาการเทียบเงื่อนไข ควรใช้ค่าตัวแปรที่คงที่ไม่ควรเปลี่ยนแปลงค่า ให้ใช้วิธีการกำหนดที่เครื่องหมายการเปรียบแทียบแทน
เช่น สมมติ ช่วงที่ 1 เวลา 2017-05-30 07:30 - 2017-05-30 19:30
แต่เราไม่ต้องการข้อมูลที่มีค่าเท่ากับ 2017-05-30 19:30
แทนที่เราจะใช้
<="2017-05-30 19:29"
เราก็ใช้เป็น
<"2017-05-30 19:30"
จะเห็นว่าเราแค่เปลี่ยนเครื่องหมายการเปรียบเทียบ โดยไม่ต้องไปเปลี่ยนค่าตัวแปรวันที่ ซึ่งอาจจะสับสนได้
นี่ตือตัวอย่างของการเปรียบเทียบเวลาสองช่วง คือ
2017-05-30 07:30 - 2017-05-30 19:30
และ
2017-05-30 19:30 - 2017-05-31 07:30
$date_start1="2017-05-30 07:30"; $date_end1=date("Y-m-d H:i",strtotime($date_start1." +12 hour")); echo $date_end1."<br>"; $date_start2="2017-05-30 19:30"; $date_end2=date("Y-m-d H:i",strtotime($date_start2." +12 hour")); echo $date_end2."<br>"; if(time()>=strtotime($date_start1) && time()<strtotime($date_end1)){ echo "Yes"; } if(time()>=strtotime($date_start2) && time()<strtotime($date_end2)){ echo "Yes"; }
ส่วนเงื่อนไขการใช้งานในคำสั่ง sql สามารถนำค่าตัวแปร มาใช้งานได้เลย เช่น
$date_start1="2017-05-30 07:30"; $date_end1=date("Y-m-d H:i",strtotime($date_start1." +12 hour")); echo $date_end1."<br>"; $date_start2="2017-05-30 19:30"; $date_end2=date("Y-m-d H:i",strtotime($date_start2." +12 hour")); echo $date_end2."<br>"; if(time()>=strtotime($date_start1) && time()<strtotime($date_end1)){ $Where="production_time >= '$date_start1' AND production_time <'$date_end1'"; echo "Yes"; } if(time()>=strtotime($date_start2) && time()<strtotime($date_end2)){ $Where="production_time >= '$date_start2' AND production_time <'$date_end2'"; echo "Yes"; }