📌  相关文章
📜  查找两个给定日期之间的天数

📅  最后修改于: 2021-05-04 08:41:18             🧑  作者: Mango

给定两个日期,找出它们之间的总天数。天数必须在O(1)时间和O(1)辅助空间中计算。

例子:

Input: dt1 = {10, 2, 2014}
       dt2 = {10, 3, 2015}
Output: 393
dt1 represents "10-Feb-2014" and dt2 represents "10-Mar-2015"
The difference is 365 + 28

Input: dt1 = {10, 2, 2000}
       dt2 = {10, 3, 2000}
Output: 29
Note that 2000 is a leap year

Input: dt1 = {10, 2, 2000}
       dt2 = {10, 2, 2000}
Output: 0
Both dates are same

Input:   dt1 = {1, 2, 2000};
         dt2 = {1, 2, 2004};
Output: 1461
Number of days is 365*4 + 1


我们强烈建议您单击此处并进行实践,然后再继续解决方案。

一个幼稚的解决方案是从dt1开始,持续计数直到达到dt2为止的天数。此解决方案需要超过O(1)的时间。
一个更好,更简单的解决方案是计算dt1之前的总天数,即从00/00/0000到dt1的总天数,然后计算dt2之前的总天数。最后返回两个计数之间的差。

Let the given two dates be "1-Feb-2000" and "1-Feb-2004"
dt1 = {1, 2, 2000};
dt2 = {1, 2, 2004};
Count number of days before dt1. Let this count be n1.
Every leap year adds one extra day (29 Feb) to total days.
n1 = 2000*365 + 31 + 1 + Number of leap years 
Count of leap years for a date 'd/m/y' can be calculated 
using the following formula:
Number leap years 
 = floor(y/4) - floor(y/100) + floor(y/400) if m > 2
  = floor((y-1)/4) - floor((y-1)/100) + floor((y-1)/400) if m <= 2
All above divisions must be done using integer arithmetic
So that the remainder is ignored.
For 01/01/2000, leap year count is 1999/4 - 1999/100 
+ 1999/400 which is 499 - 19 + 4 = 484
Therefore n1 is 2000*365 + 31 + 1 + 484

Similarly, the count number of days before dt2. 
Let this the count be n2.Finally, return n2-n1

以下是上述想法的实现。

C++
// C++ program two find number of
// days between two given dates
#include 
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


输出
Difference between two dates is 1461

注意:上面的程序从一开始就遵循公历日历。