Найдите количество дней между двумя заданными датами

Опубликовано: 21 Января, 2022

Учитывая две даты, найдите общее количество дней между ними. Количество дней должно быть рассчитано за O (1) время и O (1) во вспомогательном пространстве.

Примеры:

 Ввод: dt1 = {10, 2, 2014}
       dt2 = {10, 3, 2015}
Выход: 393
dt1 представляет «10 февраля 2014 года», а dt2 - «10 марта 2015 года».
Разница 365 + 28

Ввод: dt1 = {10, 2, 2000}
       dt2 = {10, 3, 2000}
Выход: 29
Обратите внимание, что 2000 год - високосный.

Ввод: dt1 = {10, 2, 2000}
       dt2 = {10, 2, 2000}
Выход: 0
Обе даты совпадают

Ввод: dt1 = {1, 2, 2000};
         dt2 = {1, 2, 2004};
Выход: 1461
Количество дней 365 * 4 + 1


Мы настоятельно рекомендуем вам щелкнуть здесь и попрактиковаться, прежде чем переходить к решению.

Одно наивное решение - начать с dt1 и продолжать считать дни, пока не будет достигнуто dt2. Это решение требует больше времени O (1).
Лучшее и простое решение - подсчитать общее количество дней до dt1, т.е. общее количество дней от 00/00/0000 до dt1, а затем подсчитать общее количество дней до dt2. Наконец, верните разницу между двумя счетчиками.

 Пусть заданы две даты: «1 февраля 2000 года» и «1 февраля 2004 года».
dt1 = {1, 2, 2000};
dt2 = {1, 2, 2004};
Подсчитайте количество дней до dt1. Пусть это количество равно n1.
Каждый високосный год добавляет один дополнительный день (29 февраля) к общему количеству дней.
n1 = 2000 * 365 + 31 + 1 + Количество високосных лет 
Можно рассчитать количество високосных лет для даты 'д / м / г' 
по следующей формуле:
Количество високосных лет 
 = этаж (y / 4) - этаж (y / 100) + этаж (y / 400), если m> 2
  = этаж ((y-1) / 4) - этаж ((y-1) / 100) + этаж ((y-1) / 400), если m <= 2
Все указанные выше деления должны выполняться с использованием целочисленной арифметики.
Так что остальное игнорируется.
На 01.01.2000 високосный год: 1999/4 - 1999/100. 
+ 1999/400, что составляет 499 - 19 + 4 = 484
Следовательно, n1 равно 2000 * 365 + 31 + 1 + 484

Аналогичным образом подсчитываем количество дней до dt2. 
Пусть это число равно n2. Наконец, верните n2-n1.

Below is the implementation of the above idea. 

C++

// C++ program two find number of
// days between two given dates
#include <iostream>
using namespace std;
 
// A date has day "d", month "m" and year "y"
struct Date {
    int d, m, y;
};
 
// To store number of days in
// all months from January to Dec.
const int monthDays[12]
    = { 31, 28, 31, 30, 31, 30,
       31, 31, 30, 31, 30, 31 };
 
// This function counts number of
// leap years before the given date
int countLeapYears(Date d)
{
    int years = d.y;
 
    // Check if the current year needs to be
    //  considered for the count of leap years
    // or not
    if (d.m <= 2)
        years--;
 
    // An year is a leap year if it
    // is a multiple of 4,
    // multiple of 400 and not a
     // multiple of 100.
    return years / 4
           - years / 100
           + years / 400;
}
 
// This function returns number of
// days between two given dates
int getDifference(Date dt1, Date dt2)
{
    // COUNT TOTAL NUMBER OF DAYS
    // BEFORE FIRST DATE "dt1"
 
    // initialize count using years and day
    long int n1 = dt1.y * 365 + dt1.d;
 
    // Add days for months in given date
    for (int i = 0; i < dt1.m - 1; i++)
        n1 += monthDays[i];
 
    // Since every leap year is of 366 days,
    // Add a day for every leap year
    n1 += countLeapYears(dt1);
 
    // SIMILARLY, COUNT TOTAL NUMBER OF
    // DAYS BEFORE "dt2"
 
    long int n2 = dt2.y * 365 + dt2.d;
    for (int i = 0; i < dt2.m - 1; i++)
        n2 += monthDays[i];
    n2 += countLeapYears(dt2);
 
    // return difference between two counts
    return (n2 - n1);
}
 
// Driver code
int main()
{
    Date dt1 = { 1, 2, 2000 };
    Date dt2 = { 1, 2, 2004 };
 
    // Function call
    cout << "Difference between two dates is "
         << getDifference(dt1, dt2);
 
    return 0;
}

Java

// Java program two find number of
// days between two given dates
 
class GFG
{
 
    // A date has day "d", month "m" and year "y"
    static class Date
    {
        int d, m, y;
 
        public Date(int d, int m, int y)
        {
            this.d = d;
            this.m = m;
            this.y = y;
        }
 
    };
 
    // To store number of days in
    // all months from January to Dec.
    static int monthDays[] = {31, 28, 31, 30, 31, 30,
                            31, 31, 30, 31, 30, 31};
 
    // This function counts number of
    // leap years before the given date
    static int countLeapYears(Date d)
    {
        int years = d.y;
 
        // Check if the current year needs to be considered
        // for the count of leap years or not
        if (d.m <= 2)
        {
            years--;
        }
 
        // An year is a leap year if it is a multiple of 4,
        // multiple of 400 and not a multiple of 100.
        return years / 4 - years / 100 + years / 400;
    }
 
    // This function returns number
    // of days between two given dates
    static int getDifference(Date dt1, Date dt2)
    {
        // COUNT TOTAL NUMBER OF DAYS BEFORE FIRST DATE "dt1"
 
        // initialize count using years and day
        int n1 = dt1.y * 365 + dt1.d;
 
        // Add days for months in given date
        for (int i = 0; i < dt1.m - 1; i++)
        {
            n1 += monthDays[i];
        }
 
        // Since every leap year is of 366 days,
        // Add a day for every leap year
        n1 += countLeapYears(dt1);
 
        // SIMILARLY, COUNT TOTAL NUMBER OF DAYS BEFORE "dt2"
        int n2 = dt2.y * 365 + dt2.d;
        for (int i = 0; i < dt2.m - 1; i++)
        {
            n2 += monthDays[i];
        }
        n2 += countLeapYears(dt2);
 
        // return difference between two counts
        return (n2 - n1);
    }
 
    // Driver code
    public static void main(String[] args)
    {
        Date dt1 = new Date(1, 2, 2000);
        Date dt2 = new Date(1, 2, 2004);
        System.out.println("Difference between two dates is " +
                            getDifference(dt1, dt2));
    }
}
 
// This code is contributed by 29AjayKumar

Python3

# Python3 program two find number of
# days between two given dates
 
# A date has day "d", month
# "m" and year "y"
 
 
class Date:
    def __init__(self, d, m, y):
        self.d = d
        self.m = m
        self.y = y
 
 
# To store number of days in
# all months from January to Dec.
monthDays = [31, 28, 31, 30, 31, 30,
             31, 31, 30, 31, 30, 31]
 
# This function counts number of
# leap years before the given date
 
 
def countLeapYears(d):
 
    years = d.y
 
    # Check if the current year needs
    # to be considered for the count
    # of leap years or not
    if (d.m <= 2):
        years -= 1
 
    # An year is a leap year if it is a
    # multiple of 4, multiple of 400 and
    # not a multiple of 100.
    ans = int(years / 4)
    ans -= int(years / 100)
    ans += int(years / 400)
    return ans
 
# This function returns number of
# days between two given dates
 
 
def getDifference(dt1, dt2):
 
    # COUNT TOTAL NUMBER OF DAYS
    # BEFORE FIRST DATE "dt1"
 
    # initialize count using years and day
    n1 = dt1.y * 365 + dt1.d
 
    # Add days for months in given date
    for i in range(0, dt1.m - 1):
        n1 += monthDays[i]
 
    # Since every leap year is of 366 days,
    # Add a day for every leap year
    n1 += countLeapYears(dt1)
 
    # SIMILARLY, COUNT TOTAL NUMBER
    # OF DAYS BEFORE "dt2"
    n2 = dt2.y * 365 + dt2.d
    for i in range(0, dt2.m - 1):
        n2 += monthDays[i]
    n2 += countLeapYears(dt2)
 
    # return difference between
    # two counts
    return (n2 - n1)
 
 
# Driver Code
dt1 = Date(1, 9, 2014)
dt2 = Date(3, 9, 2020)
 
# Function call
print("Difference between two dates is",
      getDifference(dt1, dt2))
 
# This code is contributed by Smitha

C#

// C# program two find number of
// days between two given dates
using System;
 
class GFG {
 
    // A date has day "d", month "m" and year "y"
    public class Date {
        public int d, m, y;
 
        public Date(int d, int m, int y)
        {
            this.d = d;
            this.m = m;
            this.y = y;
        }
    };
 
    // To store number of days in
    // all months from January to Dec.
    static int[] monthDays = { 31, 28, 31,
                               30, 31, 30,
                               31, 31, 30,
                               31, 30, 31 };
 
    // This function counts number of
    // leap years before the given date
    static int countLeapYears(Date d)
    {
        int years = d.y;
 
        // Check if the current year
        // needs to be considered
        // for the count of leap years or not
        if (d.m <= 2) {
            years--;
        }
 
        // An year is a leap year if it is
        // a multiple of 4, multiple of 400
        // and not a multiple of 100.
        return years / 4
               - years / 100
               + years / 400;
    }
 
    // This function returns number
    // of days between two given dates
    static int getDifference(Date dt1, Date dt2)
    {
        // COUNT TOTAL NUMBER OF DAYS
        // BEFORE FIRST DATE "dt1"
 
        // initialize count using years and day
        int n1 = dt1.y * 365 + dt1.d;
 
        // Add days for months in given date
        for (int i = 0; i < dt1.m - 1; i++)
        {
            n1 += monthDays[i];
        }
 
        // Since every leap year is of 366 days,
        // Add a day for every leap year
        n1 += countLeapYears(dt1);
 
        // SIMILARLY, COUNT TOTAL
        // NUMBER OF DAYS BEFORE "dt2"
        int n2 = dt2.y * 365 + dt2.d;
        for (int i = 0; i < dt2.m - 1; i++)
        {
            n2 += monthDays[i];
        }
        n2 += countLeapYears(dt2);
 
        // return difference between two counts
        return (n2 - n1);
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        Date dt1 = new Date(1, 2, 2000);
        Date dt2 = new Date(1, 2, 2004);
       
        // Function call
        Console.WriteLine("Difference between two dates is "
                          + getDifference(dt1, dt2));
    }
}
 
// This code is contributed by PrinciRaj1992
Output

Difference between two dates is 1461