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
*/