using System;
using System.Globalization;
/*
Compare two dates in C#
-----------------------
This program demonstrates how to compare two dates using C#'s built‑in
DateTime structure. It uses a modular design, clear comments, and a full test suite.
Concepts:
- Parsing dates safely (YYYY‑MM‑DD)
- Comparing DateTime 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:
- DateTime 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 DateTime.
- DateTime is timezone‑aware; here we treat dates as date‑only values.
*/
class Program
{
/*
Safely parse a date string in the format YYYY-MM-DD.
Error handling:
- Returns null if the date is invalid.
*/
static DateTime? ParseDate(string s)
{
try
{
return DateTime.ParseExact(
s,
"yyyy-MM-dd",
CultureInfo.InvariantCulture,
DateTimeStyles.None
);
}
catch
{
return null;
}
}
/*
Compare two DateTime objects.
Returns:
- "earlier"
- "later"
- "equal"
*/
static string CompareDates(DateTime a, DateTime b)
{
if (a < b) return "earlier";
if (a > b) return "later";
return "equal";
}
/*
Run a single test case:
- Parse both dates
- Handle invalid input
- Compare if valid
*/
static void RunTestCase(string d1, string d2)
{
var a = ParseDate(d1);
var b = ParseDate(d2);
if (a is null || b is null) {
Console.WriteLine($"Compare '{d1}' vs '{d2}' -> invalid date format");
return;
}
Console.WriteLine($"Compare '{d1}' vs '{d2}' -> {CompareDates(a.Value, b.Value)}");
}
/*
Main test suite:
- Multiple test cases
- Includes edge cases
- Prints results cleanly
*/
static void Main()
{
Console.WriteLine("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 (int i = 0; i < tests.GetLength(0); i++) {
RunTestCase(tests[i, 0], tests[i, 1]);
}
}
}
/*
run:
Date comparison tests:
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
*/