Unix Timestamp in Python
Updated: May 2026
Python's datetime ecosystem has evolved significantly. The modern approach — using timezone-aware datetimes with zoneinfo and always attaching UTC to the epoch — eliminates the silent bugs that plagued Python 2-era code. This guide covers the current best practices for Python 3.9+.
Convert a timestamp online →
Free · No upload · Instant
Getting the current timestamp
Python 3import time
from datetime import datetime, timezone
# Simple: seconds as float (most common)
ts = time.time() # e.g. 1735689600.123456
ts_int = int(time.time()) # e.g. 1735689600
# Via datetime (UTC-aware, recommended)
now_utc = datetime.now(tz=timezone.utc)
ts_from_dt = int(now_utc.timestamp())
# Milliseconds (for APIs that expect them)
ts_ms = int(time.time() * 1000)
Timestamp to datetime
Python 3from datetime import datetime, timezone
from zoneinfo import ZoneInfo # stdlib since Python 3.9
ts = 1735689600
# UTC-aware datetime (always prefer this)
dt_utc = datetime.fromtimestamp(ts, tz=timezone.utc)
print(dt_utc) # 2025-01-01 00:00:00+00:00
print(dt_utc.isoformat()) # 2025-01-01T00:00:00+00:00
# Specific timezone
dt_paris = datetime.fromtimestamp(ts, tz=ZoneInfo('Europe/Paris'))
print(dt_paris) # 2025-01-01 01:00:00+01:00
dt_ny = datetime.fromtimestamp(ts, tz=ZoneInfo('America/New_York'))
print(dt_ny) # 2024-12-31 19:00:00-05:00
Never use datetime.utcfromtimestamp() — it returns a naive (timezone-unaware) datetime that looks like UTC but is not tagged as such, which causes silent bugs when you pass it to other functions. Use datetime.fromtimestamp(ts, tz=timezone.utc) instead.
Datetime to timestamp
Python 3from datetime import datetime, timezone
from zoneinfo import ZoneInfo
# From an explicit UTC datetime
dt = datetime(2025, 1, 1, 0, 0, 0, tzinfo=timezone.utc)
ts = int(dt.timestamp()) # 1735689600
# From a timezone-aware datetime
dt_paris = datetime(2025, 1, 1, 1, 0, 0, tzinfo=ZoneInfo('Europe/Paris'))
ts = int(dt_paris.timestamp()) # 1735689600 — same instant
# From an ISO 8601 string
dt = datetime.fromisoformat('2025-01-01T00:00:00+00:00')
ts = int(dt.timestamp()) # 1735689600
# From a custom string with strptime
from datetime import timezone
dt = datetime.strptime('2025-01-01 00:00:00', '%Y-%m-%d %H:%M:%S')
dt_utc = dt.replace(tzinfo=timezone.utc) # attach UTC explicitly
ts = int(dt_utc.timestamp()) # 1735689600
Formatting timestamps
Python 3from datetime import datetime, timezone
from zoneinfo import ZoneInfo
ts = 1735689600
dt = datetime.fromtimestamp(ts, tz=timezone.utc)
# strftime format codes
print(dt.strftime('%Y-%m-%d')) # 2025-01-01
print(dt.strftime('%Y-%m-%d %H:%M:%S')) # 2025-01-01 00:00:00
print(dt.strftime('%A, %B %-d, %Y')) # Wednesday, January 1, 2025
print(dt.strftime('%d/%m/%Y %H:%M')) # 01/01/2025 00:00
# ISO 8601 (preferred for APIs)
print(dt.isoformat()) # 2025-01-01T00:00:00+00:00
# In a different timezone
dt_tokyo = datetime.fromtimestamp(ts, tz=ZoneInfo('Asia/Tokyo'))
print(dt_tokyo.strftime('%Y-%m-%d %H:%M:%S %Z')) # 2025-01-01 09:00:00 JST
Arithmetic with timestamps
Working with timedeltas on timezone-aware datetimes is safe and DST-correct.
Python 3from datetime import datetime, timezone, timedelta
from zoneinfo import ZoneInfo
ts = 1735689600
dt = datetime.fromtimestamp(ts, tz=timezone.utc)
# Add 7 days
dt_plus7 = dt + timedelta(days=7)
print(int(dt_plus7.timestamp())) # 1736294400
# Find start of the day in a specific timezone
tz = ZoneInfo('Europe/Paris')
dt_paris = datetime.fromtimestamp(ts, tz=tz)
start_of_day = dt_paris.replace(hour=0, minute=0, second=0, microsecond=0)
print(int(start_of_day.timestamp())) # start of Jan 1 in Paris = 1735685400
# Difference between two timestamps
ts2 = 1736294400
delta = timedelta(seconds=ts2 - ts)
print(delta.days) # 7
print(delta.seconds) # 0
Pandas timestamps
When working with dataframes, Pandas has its own Timestamp type built on NumPy's datetime64.
import pandas as pd
ts = 1735689600
# From Unix timestamp (seconds)
pd_ts = pd.Timestamp(ts, unit='s', tz='UTC')
print(pd_ts) # 2025-01-01 00:00:00+00:00
# Back to Unix timestamp
print(int(pd_ts.timestamp())) # 1735689600
# Column in a DataFrame
df = pd.DataFrame({'ts': [1735689600, 1736294400]})
df['date'] = pd.to_datetime(df['ts'], unit='s', utc=True)
df['date_paris'] = df['date'].dt.tz_convert('Europe/Paris')