reference
5 min read
·
lesson 11 of 16 in Reference
Python Datetime Format Cheat Sheet
1 · The lesson
readQuick reference for datetime, format directives, parsing, formatting, and timezones. For the full tutorial see Datetime.
1. Format Directives
| Code | Meaning | Example |
|---|---|---|
%Y | Year, 4-digit | 2026 |
%y | Year, 2-digit | 26 |
%m | Month, zero-padded | 05 |
%B | Month, full name | May |
%b | Month, short name | May |
%d | Day of month, zero-padded | 14 |
%j | Day of year (001..366) | 134 |
%a | Weekday, short | Thu |
%A | Weekday, full | Thursday |
%w | Weekday number (Sun=0) | 4 |
%U | Week number (Sunday-start) | 19 |
%W | Week number (Monday-start) | 19 |
%H | Hour 24h, zero-padded | 09 |
%I | Hour 12h, zero-padded | 09 |
%p | AM / PM | AM |
%M | Minute, zero-padded | 30 |
%S | Second, zero-padded | 45 |
%f | Microsecond | 000123 |
%z | UTC offset | +0530 |
%Z | Timezone name | IST |
%c | Locale date+time | Thu May 14 09:30:45 2026 |
%x | Locale date | 05/14/26 |
%X | Locale time | 09: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 / Symptom | Cause | Fix |
|---|---|---|
TypeError: can't compare offset-naive and offset-aware datetimes | Mixing aware + naive | Attach tz: dt.replace(tzinfo=...) or convert with astimezone |
ValueError: time data '...' does not match format '...' | strptime format mismatch | Print both, fix the directive (likely %M vs %m) |
Got month 30, minute 5 | Swapped %m (month) with %M (minute) | %m month, %M minute, %S second |
ZoneInfoNotFoundError on Windows | tzdb missing | pip install tzdata |
Off-by-one date from fromtimestamp | Implicit local conversion | Pass tz=timezone.utc explicitly |
strftime on naive datetime drops %z | No tzinfo to format | Make it aware first |
See Also
- Datetime (tutorial)
- F-Strings cheat
- File I/O cheat for logging timestamps
Practice this
on practicepython.inShort exercises that run in your browser and tell you what your code actually did, not just whether a test passed.