Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

วิธีเปรียบเทียบวันที่ในรูปแบบ String ใน Java


เมื่อวันที่อยู่ในรูปแบบ 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