← Back to the tool

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 3
import 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 3
from 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 3
from 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 3
from 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 3
from 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.

Python + Pandas
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')