โดยปกติ เราจะไม่สามารถเอาวันที่มาบวก หรือ ลบกันได้โดยตรงครับ ไม่ว่าจะเป็นในรูปแบบไหน เพราะว่าข้อมูลเกี่ยวกับวันที่ ที่ 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; //เศษที่เหลือเป็น วินาที
?>