Here's a summary of common Python time conversions
Some methods drop fractions of seconds, and are marked with (s). An explicit formula such as ts = (d - epoch) / unit can be used instead (thanks jfs).
- struct_time (UTC) → POSIX (s):
calendar.timegm(struct_time)
- Naïve datetime (local) → POSIX (s):
calendar.timegm(stz.localize(dt, is_dst=None).utctimetuple())
(exception during DST transitions, see comment from jfs) - Naïve datetime (UTC) → POSIX (s):
calendar.timegm(dt.utctimetuple())
- Aware datetime → POSIX (s):
calendar.timegm(dt.utctimetuple())
- POSIX → struct_time (UTC, s):
time.gmtime(t)
(see comment from jfs) - Naïve datetime (local) → struct_time (UTC, s):
stz.localize(dt, is_dst=None).utctimetuple()
(exception during DST transitions, see comment from jfs) - Naïve datetime (UTC) → struct_time (UTC, s):
dt.utctimetuple()
- Aware datetime → struct_time (UTC, s):
dt.utctimetuple()
\ - POSIX → Naïve datetime (local):
datetime.fromtimestamp(t, None)
(may fail in certain conditions, see comment from jfs below) - struct_time (UTC) → Naïve datetime (local, s):
datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
(can't represent leap seconds, see comment from jfs) - Naïve datetime (UTC) → Naïve datetime (local):
dt.replace(tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
- Aware datetime → Naïve datetime (local):
dt.astimezone(tz).replace(tzinfo=None)
- POSIX → Naïve datetime (UTC):
datetime.utcfromtimestamp(t)
- struct_time (UTC) → Naïve datetime (UTC, s):
datetime.datetime(*struct_time[:6])
(can't represent leap seconds, see comment from jfs) - Naïve datetime (local) → Naïve datetime (UTC):
stz.localize(dt, is_dst=None).astimezone(UTC).replace(tzinfo=None)
(exception during DST transitions, see comment from jfs) - Aware datetime → Naïve datetime (UTC):
dt.astimezone(UTC).replace(tzinfo=None)
- POSIX → Aware datetime:
datetime.fromtimestamp(t, tz)
(may fail for non-pytz timezones) - struct_time (UTC) → Aware datetime (s):
datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz)
(can't represent leap seconds, see comment from jfs) - Naïve datetime (local) → Aware datetime:
stz.localize(dt, is_dst=None)
(exception during DST transitions, see comment from jfs) - Naïve datetime (UTC) → Aware datetime:
dt.replace(tzinfo=UTC)
If you already have a datetime object my_dt you can change it to UTC with:
datetime.datetime.utcfromtimestamp(my_dt.timestamp())