I am trying to compare two dates. The dates are imported from a database as strings and may or may not be null
This is my code
private String compareDates(String date1, String date2)
{
String earliestDate = null;
// date2 is null and date1 is null
// earliest = “not seen yet”
if (date2 == null && date1 == null)
{
earliestDate = "not seen yet";
}
// date2 is null and date1 is not null
// earliest = date1
if (date2 == null && date1 != null)
{
earliestDate = date1;
}
// date2 is not null and date1 is null
// earliest = date2
if (date2 != null && date1 == null)
{
earliestDate = date2;
}
// date2 is not null and date1 is not null
// compare dates
if (date2 != null && date1 != null)
{
LocalDate LDdate1 = LocalDate.parse(date1);
LocalDate LDdate2 = LocalDate.parse(date2);
if (LDdate1.isBefore(LDdate2) || LDdate1.isEqual(LDdate2))
{
earliestDate = LDdate1.toString();
}
else
{
earliestDate = LDdate2.toString();
}
}
return earliestDate;
}
This code gives me the correct output, which is the earliest date, or "not yet seen" if both dates are null, but I wondered if there is a better / more efficient way of doing things.
I imagine using a switch statement is an option but would that be better or just a different way of doing it?
The data from the database only consists of about 200 dates so it isn't dealing with a lot of data, it's just that I'm interested in writing better code
If the dates are in standard local form and ordered YYYY MM DD like
"2018-01-24"
why bother parsing at all? Just do a String comparison. Approx 100 times faster and also easier.
public static String compareDatesStr(String date1, String date2) {
if (date1 == null)
if (date2 == null)
return "not seen yet";
else
return date2;
else if (date2 == null)
return date1;
else
return date1.compareTo(date2) > 0 ? date2 : date1;
}
Some non-scientific performance comparison:
private static String compareDatesParse(String date1, String date2) {
String earliestDate;
if (date1 == null) {
if (date2 == null) {
earliestDate = "not seen yet";
}
else {
earliestDate = date2;
}
}
else {
if (date2 == null) {
earliestDate = date1;
}
else {
LocalDate LDdate1 = LocalDate.parse(date1);
LocalDate LDdate2 = LocalDate.parse(date2);
if (LDdate1.isAfter(LDdate2)) {
earliestDate = date2;
}
else {
earliestDate = date1;
}
}
}
return earliestDate;
}
public static void testDateComp(){
String[] dates = {"2020-10-30", "2020-10-29", "1990-10-30", "2021-06-01", null};
String result = null;
int loops = 400000;
long start, end = 0;
// System.out.println("Runs: " + (dates.length*dates.length*loops));
start = System.currentTimeMillis();
for (int i = 0; i < loops; i++) {
for (String date1:dates) {
for (String date2:dates) {
result = compareDatesStr(date1, date2);
}
}
}
end = System.currentTimeMillis();
System.out.println("Runtime String: " + (end - start)+ "ms");
start = System.currentTimeMillis();
for (int i = 0; i < loops; i++) {
for (String date1:dates) {
for (String date2:dates) {
result = compareDatesParse(date1, date2);
}
}
}
end = System.currentTimeMillis();
System.out.println("Runtime Parsing: " + (end - start) + "ms");
}
10MM method executions:
Runtime String: 61ms
Runtime Parsing: 7361ms