How to calculate the difference in days between two dates in Python using the time module?

Viewed 1786

When I am passing dates like 15-05-2020 and 16-06-2020 it gives 2 but I want 32 or 33

    date1 = v_parking_in_date = input('Please Enter the Parking Start Date in dd-mm-yyyy format :')
    date2 = v_parking_out_date = input('Please Enter the Parking Completion Date in dd-mm-yyyy format :')
    date_1 = time.mktime(time.strptime(date1, "%d-%m-%Y"))
    date_2 = time.mktime(time.strptime(date2, "%d-%m-%Y"))
    d = (date_2 - date_1)
2 Answers

You could use the datetime module to compute the delta between the two dates :

import datetime as dt
import time

date1 = input('Please Enter the Parking Start Date in dd-mm-yyyy format :')
date2 = input('Please Enter the Parking Completion Date in dd-mm-yyyy format :')
date_1 = dt.date.fromtimestamp(time.mktime(time.strptime(date1, "%d-%m-%Y")))
date_2 = dt.date.fromtimestamp(time.mktime(time.strptime(date2, "%d-%m-%Y")))
d = date_2 - date_1 # datetime.timedelta(days=32)

First, by using time.mktime you are getting the value of seconds since the Epoch for your date. Then by using datetime.date.fromtimestamp you are creating a date object from this value in seconds.

If possible, do not use the time module for this task, since you do not need to take into account hours, minutes or seconds.

Using the date class from the datetime module is probably a better idea:

from datetime import date

def difference_in_days(dmy_date_1, dmy_date_2):
  # Converts the given dates to yyyy-mm-dd format (ISO 8601),
  #   so that date.fromisoformat() can work with them.
  ymd_date_1 = "-".join(reversed(dmy_date_1.split("-")))
  ymd_date_2 = "-".join(reversed(dmy_date_2.split("-")))
  # Creates actual date objects from our string values.
  date_1 = date.fromisoformat(ymd_date_1)
  date_2 = date.fromisoformat(ymd_date_2)
  # Subtracting a date object from another gives a timedelta object,
  #   which has a useful .days attribute.
  return abs(date_1 - date_2).days

Test:

>>> difference_in_days("15-05-2020", "16-06-2020")
32
Related