What Are Dates and Times in Python?

link to this section

In Python, dates and times are represented as objects that encapsulate specific moments or intervals. The datetime module is the core tool, providing classes like datetime, date, time, and timedelta, with additional support from modules like time for timestamps and pytz for time zones.

Key Classes

  • datetime.date : A date (year, month, day).
  • datetime.time : A time (hour, minute, second, microsecond).
  • datetime.datetime : A combined date and time.
  • datetime.timedelta : A duration or difference.

Example

from datetime import datetime, date, time, timedelta

# Current combined date and time
now = datetime.now()
print(now)  # e.g., 2025-03-24 10:15:23.123456

# Date only
d = date(2023, 12, 25)
print(d)  # Output: 2023-12-25

# Time only
t = time(14, 30)
print(t)  # Output: 14:30:00

# Duration
delta = timedelta(days=7)
print(delta)  # Output: 7 days, 0:00:00

Core Operations with Dates and Times

link to this section

1. Getting the Current Date

Use date.today() or datetime.now() to fetch the current date:

from datetime import date, datetime

# Current date
current_date = date.today()
print(current_date)  # e.g., 2025-03-24

# Current date from datetime
current_date_from_dt = datetime.now().date()
print(current_date_from_dt)  # e.g., 2025-03-24

2. Getting the Current Time

Extract the current time from datetime.now() or use time:

from datetime import datetime

# Current time from datetime
current_time = datetime.now().time()
print(current_time)  # e.g., 10:20:15.789123

# With specific components
print(f"Hour: {current_time.hour}, Minute: {current_time.minute}")  # e.g., Hour: 10, Minute: 20

3. Getting the Current Timestamp

A timestamp is the number of seconds since January 1, 1970 (Unix epoch):

from datetime import datetime
import time

# From datetime
current_dt = datetime.now()
timestamp_dt = current_dt.timestamp()
print(timestamp_dt)  # e.g., 1740139215.789123

# From time module
timestamp_time = time.time()
print(timestamp_time)  # e.g., 1740139215.789123

4. Date in Specific Format

Format dates using strftime() with custom directives:

from datetime import datetime

now = datetime.now()

# Specific formats
print(now.strftime("%Y-%m-%d"))         # e.g., 2025-03-24
print(now.strftime("%B %d, %Y"))        # e.g., March 24, 2025
print(now.strftime("%d/%m/%Y %H:%M"))   # e.g., 24/03/2025 10:20
print(now.strftime("%I:%M %p"))         # e.g., 10:20 AM

How to Work with Dates and Times in Python

link to this section

The datetime Module Basics

The datetime module is Python’s go-to for date and time manipulation.

Creating and Accessing

from datetime import datetime

# Current date and time
now = datetime.now()
print(now)  # e.g., 2025-03-24 10:25:15.789123

# Specific date and time
specific = datetime(2024, 6, 15, 14, 30)
print(specific)  # Output: 2024-06-15 14:30:00

# Components
print(now.year, now.month, now.day)  # e.g., 2025 3 24
print(now.hour, now.minute, now.second)  # e.g., 10 25 15

Parsing Dates and Times

Use strptime() to convert strings to datetime objects:

dt = datetime.strptime("2025-03-24 10:30:00", "%Y-%m-%d %H:%M:%S")
print(dt)  # Output: 2025-03-24 10:30:00

Features of Working with Dates and Times

link to this section

1. Arithmetic Operations

Use timedelta for date/time math:

from datetime import datetime, timedelta

# Add duration
start = datetime(2025, 1, 1, 9, 0)
later = start + timedelta(days=3, hours=2)
print(later)  # Output: 2025-01-04 11:00:00

# Subtract to get difference
end = datetime(2025, 1, 10)
diff = end - start
print(diff.days)  # Output: 9

2. Time Zones with pytz

Handle time zones for global applications:

from datetime import datetime
import pytz

# Current time in UTC
utc_now = datetime.now(pytz.UTC)
print(utc_now)  # e.g., 2025-03-24 10:30:00+00:00

# Localize to a specific timezone
ny_tz = pytz.timezone("America/New_York")
ny_time = utc_now.astimezone(ny_tz)
print(ny_time)  # e.g., 2025-03-24 06:30:00-04:00

3. Comparing Dates and Times

Direct comparison of datetime objects:

d1 = datetime(2025, 1, 1)
d2 = datetime.now()
print(d1 < d2)  # True (assuming now is 2025-03-24)

4. Common Formatting Directives

Key codes for strftime() and strptime():

  • %Y: 4-digit year (e.g., 2025)
  • %m: 2-digit month (01-12)
  • %d: 2-digit day (01-31)
  • %H: 24-hour (00-23)
  • %I: 12-hour (01-12)
  • %M: Minute (00-59)
  • %S: Second (00-59)
  • %p: AM/PM
  • %B: Full month name (e.g., March)

Example

now = datetime.now()
print(now.strftime("%A, %B %d, %Y %I:%M:%S %p"))  # e.g., Monday, March 24, 2025 10:35:15 AM

Practical Examples

link to this section

Example 1: Get Current Date and Format

from datetime import date

today = date.today()
print(today.strftime("%d-%m-%Y"))  # e.g., 24-03-2025
print(today.strftime("%B %d"))      # e.g., March 24

Example 2: Get Current Time with Timestamp

from datetime import datetime
import time

now = datetime.now()
current_time = now.time()
timestamp = now.timestamp()
print(f"Time: {current_time.strftime('%H:%M:%S')}")  # e.g., Time: 10:40:15
print(f"Timestamp: {timestamp}")                      # e.g., Timestamp: 1740140415.789123

Example 3: Schedule with Specific Format

from datetime import datetime, timedelta

def next_meeting(start_str, days):
    start = datetime.strptime(start_str, "%Y-%m-%d %H:%M")
    next_date = start + timedelta(days=days)
    return next_date.strftime("%A, %d %B %Y at %I:%M %p")

print(next_meeting("2025-03-24 09:00", 3))  # e.g., Thursday, 27 March 2025 at 09:00 AM

Example 4: Timestamp to Date

from datetime import datetime

ts = 1740140415.789123  # Example timestamp
dt = datetime.fromtimestamp(ts)
print(dt.strftime("%Y-%m-%d %H:%M:%S"))  # e.g., 2025-03-24 10:40:15

Advanced Features

link to this section

1. ISO Format Handling

# Current date to ISO
now = datetime.now()
iso_str = now.isoformat()
print(iso_str)  # e.g., 2025-03-24T10:45:15.789123

# Parse ISO
parsed = datetime.fromisoformat("2025-03-24T10:45:00")
print(parsed)  # Output: 2025-03-24 10:45:00

2. Weekday Information

now = datetime.now()
print(now.strftime("%A"))  # e.g., Monday
print(now.weekday())       # 0 (Monday, 0-6)
print(now.isoweekday())    # 1 (Monday, 1-7)

3. Replacing Components

dt = datetime.now()
new_dt = dt.replace(year=2026, hour=15, minute=0, second=0, microsecond=0)
print(new_dt.strftime("%Y-%m-%d %H:%M"))  # e.g., 2026-03-24 15:00

4. Current Date in Multiple Formats

today = date.today()
formats = [
    "%Y-%m-%d",        # 2025-03-24
    "%d/%m/%Y",        # 24/03/2025
    "%B %d, %Y",       # March 24, 2025
    "%b %d",           # Mar 24
]
for fmt in formats:
    print(today.strftime(fmt))

Performance Implications

link to this section

Overhead

  • Creation : Instantiating datetime objects is lightweight and fast.
  • Formatting : String operations (strftime) are slightly slower but optimized.

Benchmarking

import time
from datetime import datetime

start = time.time()
for _ in range(1000000):
    _ = datetime.now().strftime("%Y-%m-%d")
print(time.time() - start)  # e.g., ~0.3 seconds

Memory

  • Efficient : datetime objects use fixed memory for their fields (year, month, etc.).

Dates and Times vs. Other Tools

link to this section
  • time : For timestamps and low-level operations (e.g., time.time()).
  • calendar : For calendar-specific utilities (e.g., calendar.isleap(2024)).
  • pendulum : A third-party library with enhanced formatting and timezone support.

time Example

import time
print(time.ctime())  # e.g., Mon Mar 24 10:50:15 2025

Practical Use Cases

link to this section
  1. Timestamp Logging :
    from datetime import datetime
    def log_with_ts(message):
        ts = datetime.now().timestamp()
        print(f"[{ts}] {message}")
    log_with_ts("Event occurred")  # e.g., [1740141615.789123] Event occurred
  2. Formatted Deadline :
    from datetime import datetime, timedelta
    def deadline(days):
        return (datetime.now() + timedelta(days=days)).strftime("%d %B %Y")
    print(deadline(10))  # e.g., 03 April 2025
  3. Current Time Check :
    from datetime import datetime
    def is_working_hours():
        now = datetime.now().time()
        return time(9, 0) <= now <= time(17, 0)
    print(is_working_hours())  # e.g., True (if between 9 AM and 5 PM)
  4. Date Difference :
    def days_until(target_str):
        target = datetime.strptime(target_str, "%Y-%m-%d")
        return (target - datetime.now()).days
    print(days_until("2025-12-31"))  # e.g., 282 (from 2025-03-24)

Edge Cases and Gotchas

link to this section

1. Time Zone Naivety

naive = datetime.now() 
# naive.astimezone(pytz.UTC) # ValueError: astimezone() requires aware

2. Invalid Dates

# datetime(2025, 2, 29) # ValueError: day is out of range (not a leap year)

3. Timestamp Precision

ts = datetime.now().timestamp() 
print(ts) # Floats include microseconds (e.g., 1740141815.789123)

4. DST Ambiguity

import pytz
tz = pytz.timezone("America/New_York")
dt = tz.localize(datetime(2025, 11, 2, 1, 30))  # DST transition
print(dt.dst())  # e.g., 1:00:00 or 0:00:00 depending on ambiguity

Conclusion

link to this section

Working with dates and times in Python, centered around the datetime module, provides a versatile toolkit for temporal operations. From fetching the current date, time, and timestamp to formatting them in specific ways, Python makes it straightforward yet powerful. Whether you’re calculating durations, converting time zones with pytz, or logging timestamps, mastering these tools ensures your applications handle time effectively. Understanding their nuances—like formatting options, timezone awareness, and edge cases—empowers you to build precise, reliable, and user-friendly Python programs.