2.3. Datetime Time Deltas

2.3.1. Timedelta object

Listing 2.70. Shifting datetime objects
from datetime import datetime


gagarin = datetime(1961, 4, 12, 6, 7)
armstrong = datetime(1969, 7, 21, 2, 56, 15)

between_dates = armstrong - gagarin

str(between_dates)                  # '3021 days, 20:49:15'
between_dates                       # datetime.timedelta(days=3021, seconds=74955)
between_dates.days                  # 3021
between_dates.seconds               # 74955
between_dates.total_seconds()       # 261089355.0 (days * seconds per day + seconds)

2.3.2. Time Shift

2.3.2.1. Simple Shifts

Listing 2.71. Simple timedelta shifts
from datetime import timedelta, datetime


gagarin = datetime(1961, 4, 12)

gagarin - timedelta(minutes=15)
# datetime.datetime(1961, 4, 11, 23, 45)

gagarin + timedelta(minutes=10)
# datetime.datetime(1961, 4, 12, 0, 10)
Listing 2.72. Simple timedelta shifts
from datetime import timedelta, datetime


armstrong = datetime(1969, 7, 21, 2, 56, 15)

armstrong - timedelta(hours=21)
# datetime.datetime(1969, 7, 20, 5, 56, 15)

armstrong + timedelta(hours=5)
# datetime.datetime(1969, 7, 21, 7, 56, 15)
Listing 2.73. Simple timedelta shifts
from datetime import timedelta, date


sputnik = date(1957, 10, 4)

sputnik + timedelta(days=5)
# datetime.date(1957, 10, 9)

sputnik - timedelta(days=3)
# datetime.date(1957, 10, 1)
Listing 2.74. Simple timedelta shifts
from datetime import datetime, timedelta


gagarin = datetime(1961, 4, 12)

gagarin + timedelta(weeks=2)
# datetime.datetime(1961, 4, 26, 0, 0)

gagarin - timedelta(weeks=3)
# datetime.datetime(1961, 3, 22, 0, 0)

2.3.2.2. Complex Shifts

Listing 2.75. Complex timedelta shifts
from datetime import timedelta, datetime


armstrong = datetime(1969, 7, 21, 2, 56, 15)

armstrong - timedelta(days=2, hours=21)
# datetime.datetime(1969, 7, 18, 5, 56, 15)
Listing 2.76. Complex timedelta shifts
from datetime import timedelta, datetime


armstrong = datetime(1969, 7, 21, 2, 56, 15)

duration = timedelta(
    weeks=3,
    days=2,
    hours=21,
    minutes=5,
    seconds=12,
    milliseconds=10,
    microseconds=55)
# datetime.timedelta(days=23, seconds=75912, microseconds=10055)

between_dates = armstrong - duration
# datetime.datetime(1969, 6, 27, 5, 51, 2, 989945)

2.3.2.3. Month Shifts

Listing 2.77. Subtract month from datetime
from datetime import timedelta, date


MONTH = timedelta(days=30.436875)

gagarin = date(1961, 4, 12)
gagarin - MONTH
# datetime.date(1961, 3, 13)
Listing 2.78. Subtract month from datetime
from calendar import monthlen
from datetime import timedelta, date


def month_before(dt):
    MONTH = monthlen(dt.year, dt.month)
    return dt - timedelta(days=MONTH)


gagarin = date(1961, 4, 12)
month_before(gagarin)
# datetime.date(1961, 3, 13)

2.3.3. Duration

Listing 2.79. Duration between two datetimes
from datetime import datetime

SECOND = 1
MINUTE = 60 * SECOND
HOUR = 60 * MINUTE
DAY = 24 * HOUR
MONTH = 30.436875 * DAY  # Average days a month in solar calendar
YEAR = 365.2425 * DAY  # Solar calendar

def duration(dt):
    years, seconds = divmod(dt.total_seconds(), YEAR)
    months, seconds = divmod(seconds, MONTH)
    days, seconds = divmod(seconds, DAY)
    hours, seconds = divmod(dt.seconds, HOUR)
    minutes, seconds = divmod(seconds, MINUTE)

    return {
        'years': int(years),
        'months': int(months),
        'days': int(days),
        'hours': int(hours),
        'minutes': int(minutes),
        'seconds': int(seconds),
    }


gagarin = datetime(1961, 4, 12, 6, 7)
armstrong = datetime(1969, 7, 21, 2, 56, 15)

dt = armstrong - gagarin
# datetime.timedelta(days=3021, seconds=74955)

duration(dt)
# {'years': 8, 'months': 3, 'days': 8, 'hours': 20, 'minutes': 49, 'seconds': 15}

2.3.4. Assignments

2.3.4.1. Datetime Timedelta Period

  • Assignment name: Datetime Timedelta Period

  • Last update: 2020-10-01

  • Complexity level: easy

  • Lines of code to write: 15 lines

  • Estimated time of completion: 13 min

  • Solution: solution/datetime_timedelta_period.py

English
  1. Use data from "Input" section (see below)

  2. Given period is the time between Gagarin launch and Armstrong first step on the Moon

  3. Assume:

    • year = 365.2425 days

    • month = 30.436875 days

  4. From current date subtract this period

  5. Print calculated date

  6. How old were you at the given moment?

Polish
  1. Użyj danych z sekcji "Input" (patrz poniżej)

  2. Podany jest czas, który upłynął między startem Gagarina a pierwszym krokiem Armstronga na Księżycu

  3. Uwzględnij założenie:

    • rok = 365.2425 dni

    • miesiąc = 30.436875 dni

  4. Od obecnej chwili odejmij ten czas

  5. Wyświetl wyliczoną datę

  6. Ile miałeś wtedy lat?

Input
  • 8 years

  • 3 months

  • 8 days

  • 20 hours

  • 49 minutes

  • 15 seconds