Number of Days Between Two Dates

EASY

Description

Write a program to count the number of days between two dates.

The two dates are given as strings, their format is YYYY-MM-DD as shown in the examples.

 

Example 1:

Input: date1 = "2019-06-29", date2 = "2019-06-30"
Output: 1

Example 2:

Input: date1 = "2020-01-15", date2 = "2019-12-31"
Output: 15

 

Constraints:

  • The given dates are valid dates between the years 1971 and 2100.

Approaches

Checkout 2 different approaches to solve Number of Days Between Two Dates. Click on different approaches to view the approach and algorithm in detail.

Day-by-Day Simulation

This brute-force approach involves starting from the earlier of the two dates and incrementing day by day until the later date is reached, while keeping a count of the days passed.

Algorithm

  • Parse the input strings date1 and date2.
  • Ensure date1 is the earlier date by swapping if necessary.
  • Initialize a counter days to 0.
  • Loop while date1 is not equal to date2:
    • Advance date1 to the next calendar day.
    • Increment the days counter.
  • Return the final days count.

First, the two date strings are parsed to extract their year, month, and day components. We then determine which date is earlier to establish a starting point and an ending point. A counter is initialized to zero. We then enter a loop that continues as long as our current date is not the same as the end date. In each iteration of the loop, we advance the current date by one day and increment our counter. The logic for advancing the date must correctly handle month-ends and year-ends, including the special case of leap years for February. For example, when advancing from '2020-02-28', the next day is '2020-02-29' because 2020 is a leap year. When advancing from '2019-12-31', the next day is '2020-01-01'. Once the loop finishes, the counter holds the total number of days between the two dates.

class Solution {
    public int daysBetweenDates(String date1, String date2) {
        // Ensure date1 is the earlier date
        if (date1.compareTo(date2) > 0) {
            String temp = date1;
            date1 = date2;
            date2 = temp;
        }

        int[] d1 = parseDate(date1);
        int[] d2 = parseDate(date2);

        int days = 0;
        while (d1[0] != d2[0] || d1[1] != d2[1] || d1[2] != d2[2]) {
            d1 = getNextDay(d1);
            days++;
        }
        return days;
    }

    private int[] parseDate(String date) {
        String[] parts = date.split("-");
        return new int[]{Integer.parseInt(parts[0]), Integer.parseInt(parts[1]), Integer.parseInt(parts[2])};
    }

    private int[] getNextDay(int[] date) {
        int year = date[0];
        int month = date[1];
        int day = date[2];

        day++;
        if (day > daysInMonth(year, month)) {
            day = 1;
            month++;
            if (month > 12) {
                month = 1;
                year++;
            }
        }
        return new int[]{year, month, day};
    }

    private int daysInMonth(int year, int month) {
        int[] days = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        if (month == 2 && isLeap(year)) {
            return 29;
        }
        return days[month];
    }

    private boolean isLeap(int year) {
        return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
    }
}

Complexity Analysis

Time Complexity: O(N), where N is the number of days between the two dates. For dates far apart, this can be very slow. The maximum difference is between 1971 and 2100, which is about 130 years or ~47,500 days.Space Complexity: O(1), as we only use a few variables to store the current date and the counter, regardless of the input.

Pros and Cons

Pros:
  • Conceptually simple and easy to follow.
  • Does not require complex mathematical formulas.
Cons:
  • Inefficient for dates that are far apart.
  • The implementation of date advancement logic (handling month/year rollovers and leap years) can be tricky and prone to errors.

Code Solutions

Checking out 3 solutions in different languages for Number of Days Between Two Dates. Click on different languages to view the code.

class Solution {
public
  int daysBetweenDates(String date1, String date2) {
    return Math.abs(calcDays(date1) - calcDays(date2));
  }
private
  boolean isLeapYear(int year) {
    return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
  }
private
  int daysInMonth(int year, int month) {
    int[] days = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    days[1] += isLeapYear(year) ? 1 : 0;
    return days[month - 1];
  }
private
  int calcDays(String date) {
    int year = Integer.parseInt(date.substring(0, 4));
    int month = Integer.parseInt(date.substring(5, 7));
    int day = Integer.parseInt(date.substring(8));
    int days = 0;
    for (int y = 1971; y < year; ++y) {
      days += isLeapYear(y) ? 366 : 365;
    }
    for (int m = 1; m < month; ++m) {
      days += daysInMonth(year, m);
    }
    days += day;
    return days;
  }
}

Video Solution

Watch the video walkthrough for Number of Days Between Two Dates



Patterns:

Math

Data Structures:

String

Subscribe to Scale Engineer newsletter

Learn about System Design, Software Engineering, and interview experiences every week.

No spam, unsubscribe at any time.