
เรื่องประหลาดๆ ของการนับปีใน Java
ลืมหัวข้อ blog นี้ไปก่อนนะครับ แล้วลองพยายามเดาดูว่าโค้ด Java ข้างล่างนี้พยายามทำอะไร มันก็ดูตรงไปตรงมาใช่มั้ยครับ แล้วถ้ารันออกมาสมมติวันนี้วันที่ 1 ธันวาคม 2021 สิ่งที่ function นี้คืนกลับมาก็ เป็น 2020-12-01 ใช่มั้ยครับ ถ้าเราเขียน Unit test ไว้ เทสนี้ก็น่าจะผ่านได้ง่ายๆ ปกติไม่มีอะไร เรื่องมันมีอยู่ว่า ถ้าสมมติวันนี้เป็นวันที่ 31 ธันวาคม 2021 แล้วโค้ดชุดนี้เอาไว้บอกว่าควรจะจ่ายเงินเดือนเราตอนวันที่เท่าไร ลองทายดูมั้ยครับว่าจะเกิดอะไรขึ้น รู้จักกับ DateTimeFormatter กันก่อน ผมสังเกตุเห็น อย่างน้อยก็ใน Codebase ที่ผมทำงานด้วยอยู่ว่า Java Developer ส่วนใหญ่จะยังคุ้นเคยกับ Date API ที่มีมาตั้งแต่ Java 1.0 หน้าตาประมาณโค้ดข้างล่างครับ ซึ่ง จะเห็นได้ว่า Date API ตัวเก่าของ Java นั้นมีปัญหาเยอะมาก อย่างเช่นการที่จะปั้นเวลาซักอย่างก็เริ่มที่ปี 1900 แล้วบวกไปเอาหรือเดือนที่เริ่มที่ index ที่ 0 ซึ่งไม่ใช่ว่าทางทีมพัฒนา Java จะไม่พยายามแก้ปัญหานี้นะครับ ความพยายามแรกคือ Calendar class ที่ออกมาใน Java 1.1 แต่ก็ยังมีปัญหาหลายๆ อย่างอยู่ จน Java Developer หลายคนเลือกที่จะไปใช้ 3rd Party Library อย่าง Joda-Time แทน ซึ่งหลังจาก Oracle ได้ยึด Java ไปก็เลยเกิด Date/Time API ตัวใหม่ขึ้นมาใน Java 8 ซึ่งมีพื้นฐานหลายๆ อย่างมาจาก Joda-Time ครับ ...


