Skip to content

datetime

datetime.date - Date objects without time.

Date arithmetic with timedelta.

datetime.time - Time objects without date.

datetime.datetime - Combined date and time.

datetime.timedelta - Represents duration.

Edge cases and quirks in datetime module.

String formatting and parsing.

Basic: Create a date with year, month, day.

def test_date_creation_basic(self):
    """Basic: Create a date with year, month, day."""
    d = datetime.date(2024, 10, 3)
    assert d.year == 2024
    assert d.month == 10
    assert d.day == 3

Verification: ✅ Tested in CI

Basic: Get today's date.

def test_date_today(self):
    """Basic: Get today's date."""
    today = datetime.date.today()
    assert isinstance(today, datetime.date)
    assert today.year >= 2024

Verification: ✅ Tested in CI

Feature: Create date from Unix timestamp.

def test_date_from_timestamp(self):
    """Feature: Create date from Unix timestamp."""
    d = datetime.date.fromtimestamp(1704067200)
    assert d.year == 2024
    assert d.month == 1
    assert d.day == 1

Verification: ✅ Tested in CI

Error: Invalid date values raise ValueError.

def test_date_invalid_values_raise(self):
    """Error: Invalid date values raise ValueError."""
    with pytest.raises(ValueError):
        datetime.date(2024, 13, 1)
    with pytest.raises(ValueError):
        datetime.date(2024, 2, 30)
    with pytest.raises(ValueError):
        datetime.date(2024, 0, 1)

Verification: ✅ Tested in CI

Edge: Minimum and maximum date values.

def test_date_min_max(self):
    """Edge: Minimum and maximum date values."""
    min_date = datetime.date.min
    assert min_date.year == 1
    assert min_date.month == 1
    assert min_date.day == 1
    max_date = datetime.date.max
    assert max_date.year == 9999
    assert max_date.month == 12
    assert max_date.day == 31

Verification: ✅ Tested in CI

Basic: Add days to a date using timedelta.

def test_add_days_to_date(self):
    """Basic: Add days to a date using timedelta."""
    d = datetime.date(2024, 1, 1)
    new_date = d + datetime.timedelta(days=10)
    assert new_date == datetime.date(2024, 1, 11)

Verification: ✅ Tested in CI

Basic: Subtract dates to get timedelta.

def test_subtract_dates(self):
    """Basic: Subtract dates to get timedelta."""
    d1 = datetime.date(2024, 1, 10)
    d2 = datetime.date(2024, 1, 1)
    delta = d1 - d2
    assert delta.days == 9
    assert isinstance(delta, datetime.timedelta)

Verification: ✅ Tested in CI

Property: Date comparison operators work.

def test_date_comparison(self):
    """Property: Date comparison operators work."""
    d1 = datetime.date(2024, 1, 1)
    d2 = datetime.date(2024, 1, 2)
    d3 = datetime.date(2024, 1, 1)
    assert d1 < d2
    assert d2 > d1
    assert d1 == d3
    assert d1 != d2

Verification: ✅ Tested in CI

Edge: February 29th exists in leap years.

def test_leap_year_handling(self):
    """Edge: February 29th exists in leap years."""
    leap_date = datetime.date(2024, 2, 29)
    assert leap_date.day == 29
    with pytest.raises(ValueError):
        datetime.date(2023, 2, 29)

Verification: ✅ Tested in CI

Edge: Adding days rolls over months correctly.

def test_month_rollover(self):
    """Edge: Adding days rolls over months correctly."""
    d = datetime.date(2024, 1, 31)
    new_date = d + datetime.timedelta(days=1)
    assert new_date.month == 2
    assert new_date.day == 1

Verification: ✅ Tested in CI

Basic: Create a time with hour, minute, second.

def test_time_creation_basic(self):
    """Basic: Create a time with hour, minute, second."""
    t = datetime.time(14, 30, 45)
    assert t.hour == 14
    assert t.minute == 30
    assert t.second == 45

Verification: ✅ Tested in CI

Feature: Time supports microseconds.

def test_time_with_microseconds(self):
    """Feature: Time supports microseconds."""
    t = datetime.time(12, 30, 45, 123456)
    assert t.microsecond == 123456

Verification: ✅ Tested in CI

Error: Invalid time values raise ValueError.

def test_time_invalid_values_raise(self):
    """Error: Invalid time values raise ValueError."""
    with pytest.raises(ValueError):
        datetime.time(24, 0, 0)
    with pytest.raises(ValueError):
        datetime.time(12, 60, 0)
    with pytest.raises(ValueError):
        datetime.time(12, 30, 60)

Verification: ✅ Tested in CI

Edge: Minimum and maximum time values.

def test_time_min_max(self):
    """Edge: Minimum and maximum time values."""
    min_time = datetime.time.min
    assert min_time.hour == 0
    assert min_time.minute == 0
    assert min_time.second == 0
    max_time = datetime.time.max
    assert max_time.hour == 23
    assert max_time.minute == 59
    assert max_time.second == 59

Verification: ✅ Tested in CI

Property: Time comparison operators work.

def test_time_comparison(self):
    """Property: Time comparison operators work."""
    t1 = datetime.time(10, 0, 0)
    t2 = datetime.time(15, 0, 0)
    t3 = datetime.time(10, 0, 0)
    assert t1 < t2
    assert t2 > t1
    assert t1 == t3

Verification: ✅ Tested in CI

Basic: Create datetime with year, month, day, hour, minute, second.

def test_datetime_creation_basic(self):
    """Basic: Create datetime with year, month, day, hour, minute, second."""
    dt = datetime.datetime(2024, 10, 3, 14, 30, 45)
    assert dt.year == 2024
    assert dt.month == 10
    assert dt.day == 3
    assert dt.hour == 14
    assert dt.minute == 30
    assert dt.second == 45

Verification: ✅ Tested in CI

Basic: Get current datetime.

def test_datetime_now(self):
    """Basic: Get current datetime."""
    now = datetime.datetime.now()
    assert isinstance(now, datetime.datetime)
    assert now.year >= 2024

Verification: ✅ Tested in CI

Feature: Combine date and time objects.

def test_datetime_combine(self):
    """Feature: Combine date and time objects."""
    d = datetime.date(2024, 10, 3)
    t = datetime.time(14, 30, 45)
    dt = datetime.datetime.combine(d, t)
    assert dt.year == 2024
    assert dt.month == 10
    assert dt.day == 3
    assert dt.hour == 14
    assert dt.minute == 30

Verification: ✅ Tested in CI

Feature: Extract date and time from datetime.

def test_datetime_to_date_and_time(self):
    """Feature: Extract date and time from datetime."""
    dt = datetime.datetime(2024, 10, 3, 14, 30, 45)
    d = dt.date()
    assert d == datetime.date(2024, 10, 3)
    t = dt.time()
    assert t == datetime.time(14, 30, 45)

Verification: ✅ Tested in CI

Feature: Format datetime as string.

def test_datetime_strftime(self):
    """Feature: Format datetime as string."""
    dt = datetime.datetime(2024, 10, 3, 14, 30, 45)
    formatted = dt.strftime('%Y-%m-%d %H:%M:%S')
    assert formatted == '2024-10-03 14:30:45'

Verification: ✅ Tested in CI

Feature: Parse string to datetime.

def test_datetime_strptime(self):
    """Feature: Parse string to datetime."""
    dt = datetime.datetime.strptime('2024-10-03 14:30:45', '%Y-%m-%d %H:%M:%S')
    assert dt.year == 2024
    assert dt.month == 10
    assert dt.day == 3
    assert dt.hour == 14

Verification: ✅ Tested in CI

Basic: Create timedelta with days, seconds, microseconds.

def test_timedelta_creation(self):
    """Basic: Create timedelta with days, seconds, microseconds."""
    td = datetime.timedelta(days=5, hours=3, minutes=30)
    assert td.days == 5
    assert td.seconds == 3 * 3600 + 30 * 60

Verification: ✅ Tested in CI

Property: Timedelta supports arithmetic operations.

def test_timedelta_arithmetic(self):
    """Property: Timedelta supports arithmetic operations."""
    td1 = datetime.timedelta(days=5)
    td2 = datetime.timedelta(days=3)
    assert td1 + td2 == datetime.timedelta(days=8)
    assert td1 - td2 == datetime.timedelta(days=2)
    assert td1 * 2 == datetime.timedelta(days=10)

Verification: ✅ Tested in CI

Feature: Get total duration in seconds.

def test_timedelta_total_seconds(self):
    """Feature: Get total duration in seconds."""
    td = datetime.timedelta(days=1, hours=2, minutes=3, seconds=4)
    total = td.total_seconds()
    expected = 86400 + 7200 + 180 + 4
    assert total == expected

Verification: ✅ Tested in CI

Edge: Timedelta can be negative.

def test_timedelta_negative(self):
    """Edge: Timedelta can be negative."""
    td = datetime.timedelta(days=-5)
    assert td.days == -5
    d1 = datetime.date(2024, 1, 1)
    d2 = datetime.date(2024, 1, 10)
    delta = d1 - d2
    assert delta.days == -9

Verification: ✅ Tested in CI

Property: Timedelta comparison operators work.

def test_timedelta_comparison(self):
    """Property: Timedelta comparison operators work."""
    td1 = datetime.timedelta(days=5)
    td2 = datetime.timedelta(days=10)
    td3 = datetime.timedelta(days=5)
    assert td1 < td2
    assert td2 > td1
    assert td1 == td3

Verification: ✅ Tested in CI

Edge: Year 2000 is a leap year (divisible by 400).

def test_year_2000_is_leap_year(self):
    """Edge: Year 2000 is a leap year (divisible by 400)."""
    leap_date = datetime.date(2000, 2, 29)
    assert leap_date.day == 29

Verification: ✅ Tested in CI

Edge: Year 1900 is NOT a leap year (divisible by 100, not 400).

def test_year_1900_not_leap_year(self):
    """Edge: Year 1900 is NOT a leap year (divisible by 100, not 400)."""
    with pytest.raises(ValueError):
        datetime.date(1900, 2, 29)

Verification: ✅ Tested in CI

Edge: Datetime supports microsecond precision.

def test_datetime_microsecond_precision(self):
    """Edge: Datetime supports microsecond precision."""
    dt = datetime.datetime(2024, 1, 1, 12, 0, 0, 999999)
    assert dt.microsecond == 999999
    new_dt = dt + datetime.timedelta(microseconds=1)
    assert new_dt.second == 1
    assert new_dt.microsecond == 0

Verification: ✅ Tested in CI

Feature: ISO 8601 format support.

def test_date_iso_format(self):
    """Feature: ISO 8601 format support."""
    d = datetime.date(2024, 10, 3)
    assert d.isoformat() == '2024-10-03'
    dt = datetime.datetime(2024, 10, 3, 14, 30, 45)
    assert dt.isoformat() == '2024-10-03T14:30:45'

Verification: ✅ Tested in CI

Edge: weekday() returns 0 for Monday.

def test_weekday_monday_is_zero(self):
    """Edge: weekday() returns 0 for Monday."""
    d = datetime.date(2024, 10, 3)
    assert d.weekday() == 3
    monday = datetime.date(2024, 9, 30)
    assert monday.weekday() == 0

Verification: ✅ Tested in CI

Edge: isoweekday() returns 1 for Monday (ISO standard).

def test_isoweekday_monday_is_one(self):
    """Edge: isoweekday() returns 1 for Monday (ISO standard)."""
    monday = datetime.date(2024, 9, 30)
    assert monday.isoweekday() == 1

Verification: ✅ Tested in CI

Property: Years 1-9999 are valid.

@given(st.integers(min_value=1, max_value=9999))
def test_year_range_valid(self, year):
    """Property: Years 1-9999 are valid."""
    d = datetime.date(year, 1, 1)
    assert d.year == year

Verification: ✅ Tested in CI

Feature: Common strftime format codes.

def test_common_format_codes(self):
    """Feature: Common strftime format codes."""
    dt = datetime.datetime(2024, 10, 3, 14, 5, 7)
    assert dt.strftime('%Y') == '2024'
    assert dt.strftime('%m') == '10'
    assert dt.strftime('%d') == '03'
    assert dt.strftime('%H') == '14'
    assert dt.strftime('%M') == '05'
    assert dt.strftime('%S') == '07'

Verification: ✅ Tested in CI

Error: Invalid format string raises ValueError.

def test_parse_invalid_format_raises(self):
    """Error: Invalid format string raises ValueError."""
    with pytest.raises(ValueError):
        datetime.datetime.strptime('2024-10-03', '%Y/%m/%d')

Verification: ✅ Tested in CI