GORAGOD.com

ปัญหาการหาเดือนถัดไปของ PHP และการแก้ไขปัญหา

วันนี้เจอปัญหาแปลกๆของ PHP เข้าปัญหาหนึ่งซึ่งจะว่าเป็นบั๊กก็คงไม่เชิง เป็นปัญหาเกี่ยวกับฟังก์ชั่นวันที่ของ PHP
// วันที่เริ่มต้น
$contract_date = strtotime('2018-10-31');
// คืนค่าเดือนถัดไป
echo date('Y-m-d', strtotime('+1 month', $contract_date));
// ผลลัพท์ 2018-12-01

โค้ดด้านบน จุดประสงค์คือต้องการคืนค่าเดือนถัดไป ซึ่งมันก็ปกติดี จนกระทั่งถึงวันที่ 31 ตุลาคม มันคืนค่าผิดพลาดเป็น 1 ธํนวาคม ซึ่งเลยไปอีกเดือน

ทีแรกพิจารณาดูก็นึกว่าบั๊ก แต่ถ้าพิจารณาดูให้ดีๆพบว่า เดือนถัดไปของ 2018-10-31 จะเป็น 2018-11-31 แต่เนื่องจากเดือน 11 (พฤศจิกายน) มีเพียง 30 วัน ซึ่งไม่มีในปฏิทิน มันเลยถูกทดเป็น 2018-12-01 แทน

วิธีการแก้ไข ให้ใช้วิธีเปลี่ยนวันที่ขาเข้าให้เป็นวันที่ 1 และตัดวันที่ในผลลัพท์ออก (เนื่องจากถ้าเอาวันที่รวมเข้าไปในผลลัพท์ จะได้วันที่ที่ไม่มีอยู่จริงแทน)
// วันที่เริ่มต้น
$date = '2018-10-31';
// ตัดวันที่ออก คงไว้แต่เดือน หรือจะได้เป็น 2018-10-01
$contract_date = strtotime(date('Y-m', strtotime($date)));
// นำไปเพิ่มเดือนถัดไป และคืนค่าผลลัท์แค่ปีและเดือน
echo date('Y-m', strtotime('+1 month', $contract_date));
// ผลลัพท์ 2018-11