ch6s2_DateAndTime

Time is a critical aspect of almost every software system — from event logging and scheduling to analytics and financial transactions.

Chapter 6: Python Standard Library

Sub-Chapter: Date and Time — Managing Temporal Information

Time is a critical aspect of almost every software system — from event logging and scheduling to analytics and financial transactions.
Python’s datetime module provides a complete suite of classes for representing, manipulating, and formatting dates, times, durations, and time zones.


🕒 1. Importing the datetime Module

import datetime

The module provides several key classes:


📅 2. Getting the Current Date and Time

from datetime import datetime, date, time

current_datetime = datetime.now()
current_date = date.today()
current_time = datetime.now().time()

print(current_datetime)
print(current_date)
print(current_time)

Output:

2025-10-26 13:42:10.145312
2025-10-26
13:42:10.145312

🧱 3. Creating Specific Dates and Times

You can manually create datetime, date, or time objects:

from datetime import datetime, date, time

my_date = date(2024, 12, 25)
my_time = time(14, 30, 0)
my_datetime = datetime(2024, 12, 25, 14, 30, 0)

Each object can be accessed with properties like .year, .month, .day, .hour, etc.

print(my_datetime.year, my_datetime.hour)

🧮 4. Date and Time Arithmetic

You can add or subtract timedelta objects to perform arithmetic:

from datetime import datetime, timedelta

today = datetime.now()
future = today + timedelta(days=7, hours=3)
difference = future - today

print("One week later:", future)
print("Difference in days:", difference.days)

timedelta also supports seconds, minutes, weeks, and microseconds.


📆 5. Formatting and Parsing Dates

You can format datetime objects to strings using strftime() and parse strings back into datetimes with strptime().

from datetime import datetime

now = datetime.now()
formatted = now.strftime("%Y-%m-%d %H:%M:%S")
parsed = datetime.strptime("2025-10-26 14:30:00", "%Y-%m-%d %H:%M:%S")

print(formatted)
print(parsed)

Common strftime and strptime Directives

DirectiveMeaningExample
%YYear (4 digits)2025
%mMonth (01–12)10
%dDay of month26
%HHour (00–23)13
%MMinute (00–59)45
%SSecond (00–59)09
%aAbbreviated weekday nameSun
%AFull weekday nameSunday
%bAbbreviated month nameOct
%BFull month nameOctober
%ZTime zone nameUTC

🌐 6. Working with Time Zones

Python distinguishes between naive and aware datetime objects.

Using pytz (3rd-party library)

from datetime import datetime
import pytz

utc = pytz.UTC
eastern = pytz.timezone("US/Eastern")

now_utc = datetime.now(utc)
now_eastern = now_utc.astimezone(eastern)

print(now_utc.strftime("%Y-%m-%d %H:%M:%S %Z"))
print(now_eastern.strftime("%Y-%m-%d %H:%M:%S %Z"))

Using zoneinfo (Python 3.9+ built-in)

from datetime import datetime
from zoneinfo import ZoneInfo

now = datetime.now(ZoneInfo("Asia/Tehran"))
print(now.strftime("%Y-%m-%d %H:%M:%S %Z"))

📦 7. ISO 8601 Format

Python supports the international ISO 8601 format by default.

from datetime import datetime

now = datetime.now()
iso_str = now.isoformat()
parsed = datetime.fromisoformat(iso_str)

print(iso_str)
print(parsed)

Output:

2025-10-26T13:52:15.246352
2025-10-26 13:52:15.246352

⏰ 8. Example — Calculating Age and Duration

from datetime import datetime

birth = datetime(1995, 5, 10)
age = datetime.now() - birth
years = age.days // 365

print(f"You are approximately {years} years old.")

Example: Countdown Timer

from datetime import datetime, timedelta

event_date = datetime(2025, 12, 31, 23, 59)
time_left = event_date - datetime.now()

print(f"Days until New Year: {time_left.days}")

🧰 9. Using dateutil for Flexible Parsing

For non-standard formats or natural language strings, use python-dateutil:

from dateutil import parser

dt = parser.parse("Oct 26, 2025 2:45 pm")
print(dt)

Output:

2025-10-26 14:45:00

The dateutil library automatically detects formats — no need for manual patterns.


📜 10. Real-World Example — Logging and Scheduling

from datetime import datetime, timedelta

class Scheduler:
    def __init__(self):
        self.events = []

    def schedule(self, name, delay_minutes):
        event_time = datetime.now() + timedelta(minutes=delay_minutes)
        self.events.append((name, event_time))
        print(f"Event '{name}' scheduled for {event_time.strftime('%H:%M:%S')}")

scheduler = Scheduler()
scheduler.schedule("Backup", 30)
scheduler.schedule("Report Generation", 90)

🧭 11. Best Practices for Working with Dates and Times

✅ Always use UTC internally; convert to local time only for display.
✅ Use timezone-aware datetimes to avoid errors in global applications.
✅ Prefer datetime.now(tz=...) over naive datetime.now().
✅ Use isoformat() and fromisoformat() for standard storage.
✅ For recurring events or calendars, use timedelta instead of loops.
✅ Leverage dateutil or zoneinfo instead of hardcoding offsets.


📊 12. UML-Style Diagram of datetime Classes

+------------------+
|  datetime.date   |
+------------------+
| year, month, day |
| + today()        |
| + fromisoformat()|
+------------------+

          |
+------------------+
| datetime.datetime|
+------------------+
| date + time + tz |
| + now(), utcnow()|
| + strftime()     |
| + strptime()     |
| + isoformat()    |
+------------------+
          |

+------------------+
| datetime.timedelta|
+------------------+
| days, seconds, etc |
| + total_seconds()  |
+------------------+

🧾 Summary


By mastering Python’s date and time tools, you’ll be equipped to build precise, timezone-aware, and reliable applications — from simple timers to complex scheduling systems.