เกี่ยวกับวันที่
บน PHP การคำนวณเกี่ยวกับวันที่ต่างๆ ช่างเป็นเรื่องเข็ญใจจริงๆ มีคำถามมากมายเกี่ยวกับ วันที่ ครับ เช่น เอาวันที่มาบวกกัน เอาวันที่มาลบกัน วันที่ไหน น้อยกว่า-มากกว่า และอื่นๆ อีกมากมาย แต่ทั้งหมด มีวิธีการทำเพียง วิีธีเดียวเท่านั้นครับคือ...
โดยปกติ เราจะไม่สามารถเอาวันที่มาบวก หรือ ลบกันได้โดยตรงครับ ไม่ว่าจะเป็นในรูปแบบไหน เพราะว่าข้อมูลเกี่ยวกับวันที่ ที่ PHP รู้จักมีเพียงชนิดเดียวครับ คือข้อมูล ในรูปของ Unix timestamp ซึ่งค่าเวลา(วันที่) ในรูปแบบนี้ เราสามารถหาได้จากฟังก์ชั้น mktime() ครับ ดังนั้น หลักการคือ เราต้องแปลงค่าวันที่ของเรา ให้เป็นรูปแบบ Unix timestamp เสียก่อน แล้วเราจึงเอามาเปรียบเทียบ หรือ บวกลบกันได้
ฟังก์ชั่นสำหรับการแปลงวันที่ให้เป็นรูป Unix timestamp
การใช้งานเราก็เอาค่า วัน-เดือน-ปี ใส่ลงในฟังก์ชั่น แล้วก็เอาผลลัพท์ มา เปรียบเทียบ หรือ บวก-ลบ กันได้เลยครับ
ตัวอย่าง การเปรียบเทียบ
ส่วนการหาความแตกต่างว่า ห่างกันกี่วัน ก็หาได้ ด้วยการเอามาลบกัน เช่น
แต่สำหรับการ บวกวันที่ ไปอีก x วันเราจะใช้วิธีการใส่ค่่าลงไปในฟังก์ชั่นเลยครับ เช่น
เดือน-ปี หรือ เวลา ก็สามารถทำได้ทำนองเดียวกันครับ
ทิป คงมีคำถามว่า floor($offset/60/60/24); มาจากไหน แล้วมันจะเป็นวันได้ไง?
เฉลย....
ลองไปคิดกันเล่นๆ ถ้าจะหาเป็น ชม. นาที หรือ เดือน จะหาได้ยัง
ในส่วนของการหาความแตกต่างของเวลาเป็นชั่วโมงก็เช่นกัน เราก็สามารถหาได้ด้วยวิธีใกล้เคียงกันครับ
สำหรับการแปลงตัวเลขที่ได้จาก mktime (หรือจากการบวก-ลบ เวลา)ข้างต้น สามารถแปลงกลับให้เป็นจำนวนวัน เวลา ได้ด้วยฟังก์ชั่นนี้ครับ
โดยปกติ เราจะไม่สามารถเอาวันที่มาบวก หรือ ลบกันได้โดยตรงครับ ไม่ว่าจะเป็นในรูปแบบไหน เพราะว่าข้อมูลเกี่ยวกับวันที่ ที่ PHP รู้จักมีเพียงชนิดเดียวครับ คือข้อมูล ในรูปของ Unix timestamp ซึ่งค่าเวลา(วันที่) ในรูปแบบนี้ เราสามารถหาได้จากฟังก์ชั้น mktime() ครับ ดังนั้น หลักการคือ เราต้องแปลงค่าวันที่ของเรา ให้เป็นรูปแบบ Unix timestamp เสียก่อน แล้วเราจึงเอามาเปรียบเทียบ หรือ บวกลบกันได้
int mktime ( [int hour [, int minute [, int second [, int month [, int day [, int year [, int is_dst]]]]]]] )
ฟังก์ชั่นสำหรับการแปลงวันที่ให้เป็นรูป Unix timestamp
function dateEStime($theDay,$theMonth,$theYear) {
return mktime(0,0,0,$theMonth,$theDay,$theYear);
}
การใช้งานเราก็เอาค่า วัน-เดือน-ปี ใส่ลงในฟังก์ชั่น แล้วก็เอาผลลัพท์ มา เปรียบเทียบ หรือ บวก-ลบ กันได้เลยครับ
ตัวอย่าง การเปรียบเทียบ
$d1=dateEStime(1, 1, 2000); //1 มกราคม คศ.2000 (ต้องเป็น คศ เท่านั้น)
$d2=dateEStime(2, 1, 2000); //2 มกราคม คศ.2000
$d3=dateEStime(2, 2, 2000); //2 กุมภาพันธ์ คศ.2000
if ($d2>$d1) echo "2 มค. 2000 มากกว่า 1 มค. 2000<br />";
if ($d3>$d2) echo "2 กุมภาพันธ์ 2000 มากกว่า 2 มค. 2000<br />";
ส่วนการหาความแตกต่างว่า ห่างกันกี่วัน ก็หาได้ ด้วยการเอามาลบกัน เช่น
$offset=$d3-$d2;
$days=floor($offset/60/60/24); //แปลงเป็นจำนวนวัน
echo "2 กุมภาพันธ์ 2000 และ 2 มค. 2000 ห่างกัน $days วัน<br />";
แต่สำหรับการ บวกวันที่ ไปอีก x วันเราจะใช้วิธีการใส่ค่่าลงไปในฟังก์ชั่นเลยครับ เช่น
$add=2; //เพิ่มไปอีก 2 วัน
$dadd=dateEStime(2+$add, 2, 2000); //2 กุมภาพันธ์ คศ.2000 เพิ่มวันไปอีก $add
$newdate=date("d-m-Y", $dadd); //แปลงกลับเป็นวันที่
echo "บวกเพิ่ม จาก 2 กุมภาพันธ์ 2000 ไปอีก 2 วัน เป็นวันที่ $newdate";
เดือน-ปี หรือ เวลา ก็สามารถทำได้ทำนองเดียวกันครับ
ทิป คงมีคำถามว่า floor($offset/60/60/24); มาจากไหน แล้วมันจะเป็นวันได้ไง?
เฉลย....
floor($offset/60 วินาที/60 นาที/24 ชม.);
ลองไปคิดกันเล่นๆ ถ้าจะหาเป็น ชม. นาที หรือ เดือน จะหาได้ยัง
function time2mktime($hour, $minite, $second) {
return mktime($hour, $minite, $second);
}
$t1=time2mktime(12,0,0);
$t2=time2mktime(13,0,0);
$offset=$t2-$t1;
$hours=$offset/60/60; //แปลงเป็นจำนวน ชม.
echo $hours;
ในส่วนของการหาความแตกต่างของเวลาเป็นชั่วโมงก็เช่นกัน เราก็สามารถหาได้ด้วยวิธีใกล้เคียงกันครับ
สำหรับการแปลงตัวเลขที่ได้จาก mktime (หรือจากการบวก-ลบ เวลา)ข้างต้น สามารถแปลงกลับให้เป็นจำนวนวัน เวลา ได้ด้วยฟังก์ชั่นนี้ครับ
<?
$days=intval($timediff/86400); //แปลงเป็นจำนวนวัน
$remain=$timediff%86400; //เอาเศษ
$hours=intval($remain/3600); //แปลงเป็นจำนวนชั่วโมง
$remain=$remain%3600; //เอาเศษ
$mins=intval($remain/60); //แปลงเป็นนาที
$secs=$remain%60; //เศษที่เหลือเป็น วินาที
?>