PythonMastery
reference 5 min read · lesson 11 of 16 in Reference

Python Datetime Format Cheat Sheet

1 · The lesson

read

Quick reference for datetime, format directives, parsing, formatting, and timezones. For the full tutorial see Datetime.

1. Format Directives

CodeMeaningExample
%YYear, 4-digit2026
%yYear, 2-digit26
%mMonth, zero-padded05
%BMonth, full nameMay
%bMonth, short nameMay
%dDay of month, zero-padded14
%jDay of year (001..366)134
%aWeekday, shortThu
%AWeekday, fullThursday
%wWeekday number (Sun=0)4
%UWeek number (Sunday-start)19
%WWeek number (Monday-start)19
%HHour 24h, zero-padded09
%IHour 12h, zero-padded09
%pAM / PMAM
%MMinute, zero-padded30
%SSecond, zero-padded45
%fMicrosecond000123
%zUTC offset+0530
%ZTimezone nameIST
%cLocale date+timeThu May 14 09:30:45 2026
%xLocale date05/14/26
%XLocale time09:30:45
%%Literal %%

2. Creating Datetimes

python
from datetime import date, time, datetime, timedelta, timezone
from zoneinfo import ZoneInfo

date(2026, 5, 14)                                # 2026-05-14
time(9, 30, 0)                                   # 09:30:00
datetime(2026, 5, 14, 9, 30)                     # naive

datetime.now()                                   # naive local
datetime.now(tz=ZoneInfo("Asia/Kolkata"))        # aware
datetime.now(tz=timezone.utc)                    # aware UTC
date.today()                                     # date only

3. Parsing Strings

python
datetime.strptime("2026-05-14", "%Y-%m-%d")
datetime.strptime("14 May 2026 09:30", "%d %b %Y %H:%M")

date.fromisoformat("2026-05-14")
time.fromisoformat("09:30:00")

# 3.11+ — very forgiving, accepts most ISO 8601 forms
datetime.fromisoformat("2026-05-14T09:30:45+05:30")
datetime.fromisoformat("2026-05-14 09:30:45Z")
+ setup added so this can run · defines datetime, date, time
# Lightweight mock for objects whose attributes/methods aren't critical
class _AutoMock:
    def __init__(self, name='mock'): self._name = name
    def __getattr__(self, k): return _AutoMock(self._name + '.' + k)
    def __call__(self, *a, **kw):
        print('-> ' + self._name + '() called')
        return _AutoMock(self._name + '()')
    def __repr__(self): return '<mock ' + self._name + '>'
    def __str__(self): return '<mock ' + self._name + '>'
    def __bool__(self): return True
    def __iter__(self): return iter([])
    def __len__(self): return 0
    def __getitem__(self, k): return _AutoMock(self._name + '[...]')
    def __setitem__(self, k, v): pass
    def __enter__(self): return self
    def __exit__(self, *a): return False
    async def __aenter__(self): return self
    async def __aexit__(self, *a): return False
    def __add__(self, o): return self
    def __radd__(self, o): return self
    def __sub__(self, o): return self
    def __mul__(self, o): return self
    def __rmul__(self, o): return self
    def __truediv__(self, o): return self
    def __eq__(self, o): return isinstance(o, _AutoMock)
    def __hash__(self): return hash(self._name)
    def __lt__(self, o): return True
    def __le__(self, o): return True
    def __gt__(self, o): return False
    def __ge__(self, o): return False
    def __mro_entries__(self, bases): return (object,)

datetime = _AutoMock('datetime')
date = _AutoMock('date')
time = _AutoMock('time')

4. Formatting

python
dt = datetime(2026, 5, 14, 9, 30, 45)

dt.strftime("%Y-%m-%d %H:%M")        # '2026-05-14 09:30'
dt.isoformat()                        # '2026-05-14T09:30:45'
dt.isoformat(sep=" ", timespec="minutes")   # '2026-05-14 09:30'

# f-string format spec passes through to strftime
f"{dt:%d %b %Y, %I:%M %p}"            # '14 May 2026, 09:30 AM'
+ setup added so this can run · defines datetime
# Lightweight mock for objects whose attributes/methods aren't critical
class _AutoMock:
    def __init__(self, name='mock'): self._name = name
    def __getattr__(self, k): return _AutoMock(self._name + '.' + k)
    def __call__(self, *a, **kw):
        print('-> ' + self._name + '() called')
        return _AutoMock(self._name + '()')
    def __repr__(self): return '<mock ' + self._name + '>'
    def __str__(self): return '<mock ' + self._name + '>'
    def __bool__(self): return True
    def __iter__(self): return iter([])
    def __len__(self): return 0
    def __getitem__(self, k): return _AutoMock(self._name + '[...]')
    def __setitem__(self, k, v): pass
    def __enter__(self): return self
    def __exit__(self, *a): return False
    async def __aenter__(self): return self
    async def __aexit__(self, *a): return False
    def __add__(self, o): return self
    def __radd__(self, o): return self
    def __sub__(self, o): return self
    def __mul__(self, o): return self
    def __rmul__(self, o): return self
    def __truediv__(self, o): return self
    def __eq__(self, o): return isinstance(o, _AutoMock)
    def __hash__(self): return hash(self._name)
    def __lt__(self, o): return True
    def __le__(self, o): return True
    def __gt__(self, o): return False
    def __ge__(self, o): return False
    def __mro_entries__(self, bases): return (object,)

def datetime(*_a, **_kw):
    print('-> datetime() called')
    return _AutoMock('datetime()')

5. timedelta

python
from datetime import timedelta

td = timedelta(days=7, hours=3, minutes=15)
td.total_seconds()                    # 616500.0
td.days, td.seconds                   # (7, 11700)

# Arithmetic
later = dt + timedelta(days=30)
delta = later - dt                    # timedelta(days=30)

# Multiplication / division
fortnight = 2 * timedelta(weeks=1)
half = timedelta(hours=1) / 2         # timedelta(minutes=30)
+ setup added so this can run · defines dt
# Lightweight mock for objects whose attributes/methods aren't critical
class _AutoMock:
    def __init__(self, name='mock'): self._name = name
    def __getattr__(self, k): return _AutoMock(self._name + '.' + k)
    def __call__(self, *a, **kw):
        print('-> ' + self._name + '() called')
        return _AutoMock(self._name + '()')
    def __repr__(self): return '<mock ' + self._name + '>'
    def __str__(self): return '<mock ' + self._name + '>'
    def __bool__(self): return True
    def __iter__(self): return iter([])
    def __len__(self): return 0
    def __getitem__(self, k): return _AutoMock(self._name + '[...]')
    def __setitem__(self, k, v): pass
    def __enter__(self): return self
    def __exit__(self, *a): return False
    async def __aenter__(self): return self
    async def __aexit__(self, *a): return False
    def __add__(self, o): return self
    def __radd__(self, o): return self
    def __sub__(self, o): return self
    def __mul__(self, o): return self
    def __rmul__(self, o): return self
    def __truediv__(self, o): return self
    def __eq__(self, o): return isinstance(o, _AutoMock)
    def __hash__(self): return hash(self._name)
    def __lt__(self, o): return True
    def __le__(self, o): return True
    def __gt__(self, o): return False
    def __ge__(self, o): return False
    def __mro_entries__(self, bases): return (object,)

dt = _AutoMock('dt')

6. Timezones (zoneinfo, 3.9+)

python
from datetime import datetime, timezone
from zoneinfo import ZoneInfo

ist = ZoneInfo("Asia/Kolkata")
ny  = ZoneInfo("America/New_York")

now_utc = datetime.now(timezone.utc)
now_utc.astimezone(ist)                # convert
naive = datetime(2026, 5, 14, 9, 30)
aware = naive.replace(tzinfo=ist)      # attach without conversion

On Windows install tzdata first: pip install tzdata.

Common Patterns

python
# Start of today
from datetime import datetime, time, timedelta, date
start = datetime.combine(date.today(), time.min)

# End of today
end = datetime.combine(date.today(), time.max)

# Yesterday
yesterday = date.today() - timedelta(days=1)

# First day of current month
first = date.today().replace(day=1)

# Last day of current month
import calendar
today = date.today()
last_day = today.replace(day=calendar.monthrange(today.year, today.month)[1])

# Next Monday
def next_weekday(d, weekday):
    days = (weekday - d.weekday()) % 7 or 7
    return d + timedelta(days=days)

# ISO week number
year, week, dow = date.today().isocalendar()

# Age in whole years
from datetime import date
def age(dob):
    t = date.today()
    return t.year - dob.year - ((t.month, t.day) < (dob.month, dob.day))

# Unix timestamp <-> datetime
ts = datetime.now(timezone.utc).timestamp()
back = datetime.fromtimestamp(ts, tz=timezone.utc)

# Format duration human-friendly (rough)
def hms(td):
    s = int(td.total_seconds())
    return f"{s // 3600:02d}:{s % 3600 // 60:02d}:{s % 60:02d}"
+ setup added so this can run · defines timezone
# Lightweight mock for objects whose attributes/methods aren't critical
class _AutoMock:
    def __init__(self, name='mock'): self._name = name
    def __getattr__(self, k): return _AutoMock(self._name + '.' + k)
    def __call__(self, *a, **kw):
        print('-> ' + self._name + '() called')
        return _AutoMock(self._name + '()')
    def __repr__(self): return '<mock ' + self._name + '>'
    def __str__(self): return '<mock ' + self._name + '>'
    def __bool__(self): return True
    def __iter__(self): return iter([])
    def __len__(self): return 0
    def __getitem__(self, k): return _AutoMock(self._name + '[...]')
    def __setitem__(self, k, v): pass
    def __enter__(self): return self
    def __exit__(self, *a): return False
    async def __aenter__(self): return self
    async def __aexit__(self, *a): return False
    def __add__(self, o): return self
    def __radd__(self, o): return self
    def __sub__(self, o): return self
    def __mul__(self, o): return self
    def __rmul__(self, o): return self
    def __truediv__(self, o): return self
    def __eq__(self, o): return isinstance(o, _AutoMock)
    def __hash__(self): return hash(self._name)
    def __lt__(self, o): return True
    def __le__(self, o): return True
    def __gt__(self, o): return False
    def __ge__(self, o): return False
    def __mro_entries__(self, bases): return (object,)

timezone = _AutoMock('timezone')

Common Errors

Error / SymptomCauseFix
TypeError: can't compare offset-naive and offset-aware datetimesMixing aware + naiveAttach tz: dt.replace(tzinfo=...) or convert with astimezone
ValueError: time data '...' does not match format '...'strptime format mismatchPrint both, fix the directive (likely %M vs %m)
Got month 30, minute 5Swapped %m (month) with %M (minute)%m month, %M minute, %S second
ZoneInfoNotFoundError on Windowstzdb missingpip install tzdata
Off-by-one date from fromtimestampImplicit local conversionPass tz=timezone.utc explicitly
strftime on naive datetime drops %zNo tzinfo to formatMake it aware first

See Also

Practice this

on practicepython.in

Short exercises that run in your browser and tell you what your code actually did, not just whether a test passed.