เมื่อวันที่อยู่ในรูปแบบ String ต้องแปลงเป็นอ็อบเจกต์ Date ก่อนจึงจะเปรียบเทียบได้
วิธีที่ 1: ใช้ SimpleDateFormat + Date (Legacy)
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo {
public static void main(String args[]) throws ParseException {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-dd-MM");
String dateStr1 = "2007-11-25";
String dateStr2 = "1999-9-12";
// Parse สตริงเป็น Date
Date date1 = formatter.parse(dateStr1);
Date date2 = formatter.parse(dateStr2);
// เปรียบเทียบ
if (date1.after(date2)) {
System.out.println(dateStr1 + " is after " + dateStr2);
} else if (date1.before(date2)) {
System.out.println(dateStr1 + " is before " + dateStr2);
} else {
System.out.println(dateStr1 + " is equal to " + dateStr2);
}
}
}
ผลลัพธ์
2007-11-25 is after 1999-9-12
วิธีที่ 2: ใช้ LocalDate.parse() (Java 8+) - แนะนำ
import java.time.LocalDate;
public class Test {
public static void main(String args[]) {
String dateStr1 = "2007-11-25";
String dateStr2 = "1999-9-12";
// Parse สตริงเป็น LocalDate (รูปแบบ ISO yyyy-MM-dd)
LocalDate date1 = LocalDate.parse(dateStr1);
LocalDate date2 = LocalDate.parse(dateStr2);
if (date1.isAfter(date2)) {
System.out.println(dateStr1 + " is after " + dateStr2);
} else if (date1.isBefore(date2)) {
System.out.println(dateStr1 + " is before " + dateStr2);
} else {
System.out.println(dateStr1 + " is equal to " + dateStr2);
}
}
}
ผลลัพธ์
2007-11-25 is after 1999-9-12
⚠️ ข้อผิดพลาดในโค้ดต้นฉบับ: ตัวอย่างที่ 2 ในต้นฉบับมี bug - parse dateStr1 สองครั้ง ทำให้ date1 และ date2 เหมือนกัน จึงได้ผลลัพธ์ "equal" ผิดพลาด โค้ดข้างบนแก้ไขแล้ว
วิธีที่ 3: ใช้ DateTimeFormatter สำหรับรูปแบบที่ไม่ใช่ ISO
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class Test {
public static void main(String args[]) {
String dateStr1 = "25-12-2020";
String dateStr2 = "01-01-2021";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
LocalDate date1 = LocalDate.parse(dateStr1, formatter);
LocalDate date2 = LocalDate.parse(dateStr2, formatter);
System.out.println(date1.isBefore(date2) ? "date1 ก่อน date2" : "date1 หลังหรือเท่ากับ date2");
}
}
ตารางเปรียบเทียบ
| วิธี | รองรับรูปแบบ | Thread-Safe | คำแนะนำ |
|---|---|---|---|
| SimpleDateFormat + Date | ทุกรูปแบบ (ระบุ pattern) | ไม่ | Legacy เท่านั้น |
| LocalDate.parse() | ISO (yyyy-MM-dd) เท่านั้น | ใช่ | แนะนำสำหรับรูปแบบมาตรฐาน |
| LocalDate.parse() + DateTimeFormatter | ทุกรูปแบบ | ใช่ | แนะนำ #1 สำหรับ Java 8+ |
ข้อแนะนำ
- เก็บวันที่ในฐานข้อมูล/ส่งผ่าน API ใช้รูปแบบ ISO 8601 (yyyy-MM-dd) เพื่อ parse ได้โดยไม่ต้องระบุ formatter
- ใช้ DateTimeFormatter.ofPattern() สำหรับรูปแบบที่กำหนดเอง
- หลีกเลี่ยง SimpleDateFormat ใน multi-threaded environment