การใช้งานรูปแบบข้อความวันที่และเวลา กับฟังก์ชั่น strtotime() ใน php

เขียนเมื่อ 6 ปีก่อน โดย Ninenik Narkdee
เปรียบเทียบวันที่ strtotime() date() วันที่และเวลา

คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ เปรียบเทียบวันที่ strtotime() date() วันที่และเวลา

ดูแล้ว 52,649 ครั้ง




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

 


   เพิ่มเติมเนื้อหา ครั้งที่ 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 เป็นกำลังใจ ให้มีบทความใหม่ๆ เรื่อยๆ น่ะครับ







เนื้อหาที่เกี่ยวข้อง









URL สำหรับอ้างอิง





คำแนะนำ และการใช้งาน

สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก


  • ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ
  • เปลี่ยน


    ( หรือ เข้าใช้งานผ่าน Social Login )







เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ