ในบทความที่แล้วผมได้กล่าวถึงการหาวันถัดไปและก่อนหน้าจากวันที่ปัจจุบันไปแล้วนะครับ แต่มันมีกรณีหนึ่งคือว่าถ้าเราต้องการหาวันถัดไปและวันก่อนหน้าของวันที่ที่เรากำหนดเองล่ะ จะทำอย่างไร ในเมื่อฟังก์ชัน localtime() มันต้องการรับค่าพารามิเตอร์เป็น timestamp ดังนั้นเราก็ต้องแปลงค่าวันที่ที่เรากำหนดนั้นให้เป็น timestamp เสียก่อน
#!/usr/bin/perl use POSIX; $mydate = "2009-08-20"; ($year, $mon, $date) = split(/-/, $mydate); # ก่อนจะเข้าฟังก์ชัน mktime ก็ต้องทำให้อยู่ในรูปแบบที่มันยอมรับ ซึ่งก็คือมันจะมองว่าเดือนมีตั้งแต่ 0-11 (ไม่ใช่ 1-12) และปีที่จะส่งไปนั้นจะต้องนำไปลบกับ 1900 ก่อน $mon--; $year -= 1900; # รูปแบบของมันคือ mktime(second, minute, hour, date, mon, year, wday, yday, isdst) แต่ที่ส่งไปแค่ 3 ค่าเพราะว่าเราสนใจเฉพาะวันที่เท่านั้น $ts_mydate = mktime(0, 0, 0, $date, $mon, $year, 0, 0, -1); # จะได้ค่า timestamp ออกมาแล้วครับ ซึ่งผมจะใช้ค่านี้ในตัวอย่างต่อไป print $ts_mydate . "\n"; # ผลลัพธ์ที่ได้คือ 1250010000
#!/usr/bin/perl
# ต่อจากตัวอย่างที่แล้ว แต่ตัด comment ออกนะครับ
use POSIX;
$mydate = "2009-08-12";
($year, $mon, $date) = split(/-/, $mydate);
print "From date: " . sprintf("%02d-%02d-%04d", $date, $mon, $year) . "<br />";
$mon--;
$year -= 1900;
$ts_mydate = mktime(0, 0, 0, $date, $mon, $year, 0, 0, -1);
# ในกรณีนี้ผมต้องการหา 5 วันต่อจากวัน 2009-08-12 นะครับ
$number = 5;
($sec, $min, $hour, $date_next, $mon_next, $year_next, $dayno) = localtime($ts_mydate-(86400*$number));
$mon_next++;
$year_next+=1900;
print "Next 5 date: " . sprintf("%02d-%02d-%04d", $date_next, $mon_next, $year_next) . "<br />";
# ผลลัพธ์ที่ได้คือ
# From date: 12-08-2009
# Next 5 date: 17-08-2009
Login
Search