How to compare two dates in Java

1 Answer

0 votes
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;

/**
    Compare two dates in Java
    -------------------------
    This program demonstrates how to compare two dates using Java's built‑in
    java.time API. It uses a modular design, clear comments, and a full test suite.

    Concepts:
        - Parsing dates safely (YYYY‑MM‑DD)
        - Comparing LocalDate objects
        - Handling invalid formats
        - Edge‑case testing

    Architecture notes:
        - A dedicated function handles parsing.
        - Another function performs comparison.
        - Main runs multiple predefined test cases.
        - No external dependencies; only standard library.

    Performance notes:
        - LocalDate comparisons are O(1).
        - Parsing is fast and predictable.
        - Memory usage is minimal.

    Pitfalls:
        - Invalid date strings must be handled.
        - Comparing raw strings is unsafe; always convert to LocalDate.
        - LocalDate is date‑only; no timezone concerns here.
*/

/**
 * Safely parse a date string into a LocalDate.
 *
 * Supported format: YYYY-MM-DD
 *
 * Error handling:
 *   - Returns null if the date is invalid.
 */
public class CompareDates {

    private static LocalDate parseDate(String s) {
        try {
            return LocalDate.parse(s, DateTimeFormatter.ISO_LOCAL_DATE);
        } catch (DateTimeParseException ex) {
            return null;
        }
    }

    /**
     * Compare two LocalDate objects.
     *
     * Returns:
     *   - "earlier"
     *   - "later"
     *   - "equal"
     */
    private static String compareDates(LocalDate a, LocalDate b) {
        if (a.isBefore(b)) return "earlier";
        if (a.isAfter(b)) return "later";
        return "equal";
    }

    /**
     * Run a single test case:
     *   - Parse both dates
     *   - Handle invalid input
     *   - Compare if valid
     */
    private static void runTestCase(String d1, String d2) {
        LocalDate a = parseDate(d1);
        LocalDate b = parseDate(d2);

        if (a == null || b == null) {
            System.out.println("Compare '" + d1 + "' vs '" + d2 + "' → invalid date format");
            return;
        }

        System.out.println("Compare '" + d1 + "' vs '" + d2 + "' → " + compareDates(a, b));
    }

    /**
     * Main test suite:
     *   - Multiple test cases
     *   - Includes edge cases
     *   - Prints results cleanly
     */
    public static void main(String[] args) {
        System.out.println("Date comparison tests:\n");

        String[][] tests = {
            {"2024-01-01", "2024-01-02"},   // earlier
            {"2024-01-02", "2024-01-01"},   // later
            {"2024-01-01", "2024-01-01"},   // equal
            {"1999-12-31", "2000-01-01"},   // millennium boundary
            {"2024-02-29", "2024-03-01"},   // leap year
            {"2024-02-29", "2023-02-28"},   // leap vs non-leap
            {"2024-13-01", "2024-01-01"},   // invalid month
            {"2024-00-10", "2024-01-01"},   // invalid month
            {"2024-01-32", "2024-01-01"},   // invalid day
            {"abcd-ef-gh", "2024-01-01"},   // invalid format
            {"2024-01-01", "abcd-ef-gh"},   // invalid format
        };

        for (String[] t : tests) {
            runTestCase(t[0], t[1]);
        }
    }
}


/*
run:

Compare '2024-01-01' vs '2024-01-02' → earlier
Compare '2024-01-02' vs '2024-01-01' → later
Compare '2024-01-01' vs '2024-01-01' → equal
Compare '1999-12-31' vs '2000-01-01' → earlier
Compare '2024-02-29' vs '2024-03-01' → earlier
Compare '2024-02-29' vs '2023-02-28' → later
Compare '2024-13-01' vs '2024-01-01' → invalid date format
Compare '2024-00-10' vs '2024-01-01' → invalid date format
Compare '2024-01-32' vs '2024-01-01' → invalid date format
Compare 'abcd-ef-gh' vs '2024-01-01' → invalid date format
Compare '2024-01-01' vs 'abcd-ef-gh' → invalid date format

*/

 



answered Sep 20 by avibootz
...