การใช้งานรูปแบบข้อความวันที่และเวลา กับฟังก์ชั่น strtotime() ใน php
เขียนเมื่อ 6 ปีก่อน โดย Ninenik Narkdeedate() strtotime() วันที่และเวลา เปรียบเทียบวันที่
คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ date() strtotime() วันที่และเวลา เปรียบเทียบวันที่
UPDATE! อัพเดทล่าสุด 04-07-2020
04-07-2020 | การใช้รูปแบบกำหนดเงื่อนไขช่วงเวลาด้วย strtotime() ฟังก์ชั่น เพิ่มเติมที่ 2
04-07-2020 | การใช้รูปแบบกำหนดเงื่อนไขช่วงเวลาด้วย strtotime() ฟังก์ชั่น เพิ่มเติมที่ 2
ไปที่ Copy
เนื้อหานี้จะเป็นแนวทางการใช้งานรูปแบบวันที่และเวลาที่เป็นข้อความ เพื่อประยุกต์ใช้งานเกี่ยวกับ
วันที่และเวลาที่ต้องการ ตัวอย่างเช่น วันอังคารหน้าวันที่เท่าไหร่ เสาร์ที่สองของเดือนมกราคมคือวันที่เท่าไหร่
เหล่านี้เป็นต้น
โดยแนะนำว่าเนื้อหาในตอนนี้ เป็นทางเลือกสำหรับจัดการเกี่ยวกับวันที่และเวลาที่ซับซ้อน เลือกนำไปใช้
ถ้าเห็นว่ามีประโยชน์ โดยไม่ต้องจำสัญลักษณ์ทั้งหมดก็ได้ แต่ใหัรู้ว่ามีวิธีเหล่านี้อยู่ ซึ่งถ้าหากต้องการใช้งาน
ก็สามารถกลับมาดูเนื้อหาในบทความนี้เป็นแนวทางได้ ซึ่งเท่าที่ดูแล้ว บางรูปแบบคำสั่งอาจจะไม่จำเป็น
บางคำสั่งก็น่าสนใจ ลองอ่านรายละเอียดกันดู
ดูต้นฉบับอ้างอิงได้ที่ 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()
ข้อมูลจากคำตอบที่ http://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"; }
เพิ่มเติมเนื้อหา ครั้งที่ 1 วันที่ 04-06-2017
รูปแบบการเทียบช่วงเวลา 2 ช่วงเวลา ตามกระทู้คำถาม หากเรากำหนดวันที่เริ่มต้น
แบบตายตัว ค่าของวันที่ก็จะทำงานถูกต้อง แต่กรณีเราใช้วันที่ ณ ปัจจุบันในขณะนั้น
ด้วยคำสั่ง date("Y-m-d") การกำหนดช่วงข้ามวันจะเกิดข้อผิดพลาด ดังนั้น เราต้องปรับโค้ดเล็กน้อย
แต่ก่อนอื่นจะขออธิบายให้ภาพแบบฟิกค่าวันที่กับแบบใช้ค่าวันที่ ณ ปัจจุบันขณะนั้น
กรณ๊ฟิกค่าวันที่ตามตัวอย่าง
$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>";
เราจะได้ ช่วงเวลาที่ 1 คือค่า $date_start1 กับ $date_end1
เป็น 2017-05-30 07:30 กับ 2017-05-30 19:30 ซึ่งยังไม่ข้ามวัน เป็นค่าที่ถูกต้อง
และช่วงที่ 2 คือค่า $date_start2 กับ $date_end2
เป็น 2017-05-30 19:30 กับ 2017-05-31 07:30 ซึ่งมีการข้ามวัน และเป็นค่าวันที่ที่ถูกต้อง
กรณีใช้ค่าวันที่ ณ ปัจจุบัน
เช่น
$nowDate=date("Y-m-d"); $date_start1="$nowDate 07:30"; $date_end1=date("Y-m-d H:i",strtotime($date_start1." +12 hour")); echo $date_end1."<br>"; $date_start2="$nowDate 19:30"; $date_end2=date("Y-m-d H:i",strtotime($date_start2." +12 hour")); echo $date_end2."<br>";
เราจะได้ ช่วงเวลาที่ 1 คือค่า $date_start1 กับ $date_end1
เป็น 2017-05-30 07:30 กับ 2017-05-30 19:30 ซึ่งยังไม่ข้ามวัน เป็นค่าที่ถูกต้อง
แต่ถ้าเวลาขณะนั้นเป็นเวลาหลังเที่ยงคืนซึ่ง ข้ามวัน ค่าต่างๆ จะขยับเปลี่ยนแปลง
เป็น 2017-05-31 07:30 กับ 2017-05-31 19:30 พอข้ามวัน แล้วกลายเป็นค่าที่ไม่ถูกต้อง
และช่วงที่ 2 คือค่า $date_start2 กับ $date_end2
เป็น 2017-05-30 19:30 กับ 2017-05-31 07:30 ซึ่งถ้ายังไม่มีการข้ามวัน จะเป็นค่าวันที่ที่ถูกต้อง
แต่ถ้าเวลาขณะนั้นเป็นเวลาหลังเที่ยงคืนซึ่ง ข้ามวัน ค่าต่างๆ จะขยับเปลี่ยนแปลง
เป็น 2017-05-31 19:30 กับ 2017-06-01 07:30 พอข้ามวัน แล้วกลายเป็นค่าที่ไม่ถูกต้อง
ดังนั้นกรณีเราใช้วันที่ ณ ปัจจุบัน เราต้องกำหนดเงื่อนไขเพื่อเช็คหลังเที่ยงคืน ไปจนถึงเวลาสิ้นสุด
ของช่วงที่สอง ต้องกำหนดให้วันที่เริ่มต้นเป็นวันที่ผ่านมา ซึ่งจะได้ค่าคล้ายๆ กับการฟิกค่า
โดยทำโดยการแทรกเงื่อนไขเข้าไป ได้ดังนี้
$nowDate=date("Y-m-d"); // ถ้าข้ามวันและอยู่ในช่วงก่อนถึงสิ้นสุดช่วงที่สอง ให้ปรับเป็นค่าวันที่เมื่อวาน if(time()>=strtotime("00:00:00") && time()<strtotime("07:30:00")){ $nowDate=date("Y-m-d",strtotime("last day")); } $date_start1="$nowDate 07:30"; $date_end1=date("Y-m-d H:i",strtotime($date_start1." +12 hour")); echo $date_end1."<br>"; $date_start2="$nowDate 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"; }
เพิ่มเติมเนื้อหา ครั้งที่ 2 วันที่ 04-07-2020
การใช้รูปแบบกำหนดเงื่อนไขช่วงเวลาด้วย strtotime() ฟังก์ชั่น
เพิ่มเติมเนื้อหา ที่เราสามารถนำไปปรับประยุกต์ใช้งาน โดยเป็นการกำหนด
รูปแบบโดยใช้ รูปแบบข้อความ หลายๆ รูปแบบมารวมกัน เช่น
วันที่ 1 เดือน มกราคม
strtotime("first day of january")
แต่ถ้าเราอยากได้เป็นช่วงตั้งแต่เที่ยงคืนของวันที่ 1 หรือที่เวลา 00:00:00
ให้กำหนดคำว่า midnight เข้าไปด้วย หากไม่กำหนด จะเป็นเวลา ณ ขณะที่เรียกใช้คำสั่ง
strtotime("first day of january midnight")
ถึงแม้เราจะรู้อยู่แล้วว่า หากต้องการจะกำหนดเงื่อนไขวันที่ 1 ของแต่ละปี ก็แคำหนดวันที่เดือน และปี
ง่ายๆ แต่ถ้าเราไม่ต้องการที่จะต้องมาเปลี่ยนปี แต่ละครั้ง เราก็สามารถใช้ข้อมูลแบบ dynamic หรือ real time
ด้วยคำสั่ง strtotime() แล้วกำหนดรูปแบบข้อความข้างต้น
ลองดูตัวอย่างค่าต่างๆ ดังนี้
<?php date_default_timezone_set("Asia/Bangkok"); // ป้องกันกรณีเวลา server ไม่ตรง // สมมติวันนี้เป็นวันที่ 2020-07-04 // เราให้วันที่ ที่ต้องการตรวจสอบเงื่อนไขเป็น 2020-07-01 $date_check = strtotime("2020-07-01"); // จะเป็น timestamp ที่เวลา 00:00:00 // $date_check = strtotime("2020-07-01 12:00:00"); // จะเป็น timestamp ที่เวลา 12:00:00 if($date_check>=strtotime("today midnight")){ // เทียบกับวันที่เวลา 2020-07-04 00:00:00 // ทำคำสั่ง }elseif($date_check>=strtotime("yesterday midnight")){// เทียบกับวันที่เวลา 2020-07-03 00:00:00 // ทำคำสั่ง }elseif($date_check>=strtotime("-3 day midnight")){ // เทียบกับวันที่เวลา 2020-07-01 00:00:00 // ทำคำสั่ง }elseif($date_check>=strtotime("monday this week midnight")){ // เทียบกับวันที่เวลา 2020-06-29 00:00:00 // ทำคำสั่ง }elseif($date_check>=strtotime("monday last week midnight")){ // เทียบกับวันที่เวลา 2020-06-22 00:00:00 // ทำคำสั่ง }elseif($date_check>=strtotime("-3 week midnight")){ // เทียบกับวันที่เวลา 2020-06-13 00:00:00 // ทำคำสั่ง }elseif($date_check>=strtotime("first day of this month midnight")){ // เทียบกับวันที่เวลา 2020-07-01 00:00:00 // ทำคำสั่ง }elseif($date_check>=strtotime("first day of last month midnight")){ // เทียบกับวันที่เวลา 2020-06-01 00:00:00 // ทำคำสั่ง }elseif($date_check>=strtotime("-3 month midnight")){ // เทียบกับวันที่เวลา 2020-04-04 00:00:00 // ทำคำสั่ง }elseif($date_check>=strtotime("first day of january midnight")){ // เทียบกับวันที่เวลา 2020-01-01 00:00:00 // ทำคำสั่ง }
ถ้าเรามีข้อมูล และในข้อมูลมีวันที่ และเราต้องการนำวันที่ในข้อมูลนั้นๆ มากำหนดเงื่อนไข เราก็ใช้รูปแบบตามข้างต้น
ในตัวอย่าง โดยให้ช่วงเวลาที่เพิ่งเกิดขึ้น หรือเกิดขึ้นล่าสุดอยู่ด้านบน และไล่ลำดับลงไปเรื่อยๆ
ในตัวอย่าง เราสมมติว่าวันนี้เป็นวันที่ 4 เดือน 7 และวันที่ที่ต้องการเช็คเป็นวันที่ 1 เดือน 7 ถ้าสังเกตให้เงื่อนไข
ก็จะพบว่า มีเงื่อนไขที่ตรงอยู่สองเงื่อนไข คือ
}elseif($date_check>=strtotime("-3 day midnight")){ // เทียบกับวันที่เวลา 2020-07-01 00:00:00 // และ }elseif($date_check>=strtotime("first day of this month midnight")){ // เทียบกับวันที่เวลา 2020-07-01 00:00:00
ดังนั้นเงื่อนไขแรก จะทำงานก่อน เพราะเราให้ความสำคัญกับเงื่อนไขที่อยู่ก่อนหน้า หมายถึง "ข้อมูลใน 3 วันก่อน"
กับอีกอันคือ "ข้อมูลของเดือนนี้" แต่สมมติว่าวันที่เป็นวันที่ 5 เดือน 7 เงื่อนไขแรกจะเป็นการเทียบกับวันที่
2020-07-02 00:00:00 ในขณะที่เงื่อนไขที่สอง เทียบกับวันที่เดิมคือ เทียบกับวันที่เวลา 2020-07-01 00:00:00
กรณีนี้ จะเข้าสู่การทำงานเงื่อนไขที่ 2 ให้เข้าใจโดยง่ายว่า ยิ่งเวลาที่ต้องการเช็คห่างจากปัจจุบันมากเท่าไหร่ ค่าความ
สำคัญเราก็ให้น้อยลงไปเรื่อยๆ หรือถ้าใช้คำ ก็จะประมาณว่า สมมติวันนี้วันที่ 1 ข้อมูลที่จะเช็คก็เป็นของวันที่ 1
เราก็จะเรียกข้อมูลที่จะเช็คว่าข้อมูลของวันนี้ มากกว่าที่เรียกว่าเป็นข้อมูลของเดือนนี้ และถ้าเวลาผ่านออกมาเรื่อยๆ
เช่นวันนี้เป็นวันที่ 10 ข้อมูลที่จะเช็คเป็นวันที่ 1 ดังนั้นข้อมูลที่เราจะเช็ค เราก็จะเรียกว่าข้อมูลของเดือนนี้ เป็นต้น
ข้อสังเกต: เนื่องจากเราใช้การคำนวณค่าวันที่จากเวลาของ server และเพื่อป้องกันการคลาดเคลื่อนของเวลา
ทีอาจไม่ถูกต้อง เราควรกำหนดการใช้ timezone ไว้ด้านบนของการเรียกใช้งานไฟล์
date_default_timezone_set("Asia/Bangkok"); // ป้องกันกรณีเวลา server ไม่ตรง
กด Like หรือ Share เป็นกำลังใจ ให้มีบทความใหม่ๆ เรื่อยๆ น่ะครับ

เนื้อหาที่เกี่ยวข้อง
-
25 Sep2008การสร้างวันเวลาปัจจุบัน ด้วยฟังก์ชัน date() อ่าน 36,861
ตัวอย่างรูปแบบการแสดงวันเวลาปัจจุบัน <?php // Assuming today is: March
-
18 Mar2010การเก็บข้อมูลวันที่ ในฐานข้อมูล กับคำสั่ง sql ในการค้นหา อ่าน 42,193
การกำหนดประเภทของ field ในตารางฐานข้อมูลเป็น date หรือ datetime ทำให้เราสามารถ
-
17 Jan2011เทคนิค วิธี การแสดงข้อมูล ด้วยเงื่อนไข วันที่ date ใน mysql อ่าน 90,510
กำหนดให้แสดงรายการข้อมูลของวันที่ปัจจุบัน ถ้าเก็บข้อมูลเป็นแบบ DATE ตัวอย่าง
-
11 Jan2012รู้จัก และใช้งาน DATEDIFF() ใน mysql ฟังก์ชัน เทียบช่วงเวลาที่เหลือ อ่าน 81,467
datediff() เป็น ฟังก์ชันเกี่ยวกับวันที่ของ mysql ใช้สำหรับหาค่าต่างของวันท
-
08 Sep2014ตัวอย่าง การใช้งาน วันที่ ใน mysql และคำสั่ง เทคนิค การ query อ่าน 53,418
โครงสร้างฐานข้อมูลทดสอบ ประกอบคำอธิบาย -- -- Table structu
-
กำลังอ่านเนื้อหานี้อยู่05 Jun2017การใช้งานรูปแบบข้อความวันที่และเวลา กับฟังก์ชั่น strtotime() ใน php อ่าน 50,771
เนื้อหานี้จะเป็นแนวทางการใช้งานรูปแบบวันที่และเวลาที่เป็นข้อความ เพื่อประยุกต
URL สำหรับอ้างอิง
Top
Copy
ขอบคุณทุกการสนับสนุน
![]()