Is it possible, and if yes, how, to get the time zone (i.e. the UTC offset or a datetime.timezone
instance with that offset) that is used by datetime.datetime.fromtimestamp()
to convert a POSIX timestamp (seconds since the epoch) to a datetime
object?
datetime.datetime.fromtimestamp()
converts a POSIX timestamp to a naive datetime
object (i.e. without a tzinfo
), but does so using the system's locale to adjust it to the local timezone and the UTC offset that was in effect at that time.
For example, using the date 2008-12-27 midnight UTC (40 * 356 * 86400 seconds since the epoch):
>>> datetime.datetime.fromtimestamp(40 * 356 * 86400)
datetime.datetime(2008, 12, 27, 1, 0)
That timestamp is converted to a datetime
object at 1 o'clock in the morning (which it was at that time, here in an CET/CEST timezone). 100 days later, this is the result:
>>> datetime.datetime.fromtimestamp((40 * 356 + 100) * 86400)
datetime.datetime(2009, 4, 6, 2, 0)
Which is 2 o'clock in the morning. This is because by then, DST was active.
I'd expected that datetime.datetime.fromtimestamp()
would set the tzinfo
it uses in the returned datetime
instance, but it doesn't.
From the Python documentation:
The key part of this description as it relates to your question is that when you don't specify a time zone, not only does it use the local time zone, but the result is naive. You seem to want it to be aware.
This is a particular distinction made by Python, and is discussed right at the very top of the datetime documentation.
If what you want is a
datetime
that is aware of the local time zone, try the tzlocal library. It is focused on that particular problem. See also this question.datetime.fromtimestamp(ts)
converts "seconds since the epoch" to a naive datetime object that represents local time.tzinfo
is alwaysNone
in this case.Local timezone may have had a different UTC offset in the past. On some systems that provide access to a historical timezone database,
fromtimestamp()
may take it into account.To get the UTC offset used by
fromtimestamp()
:See also, Getting computer's utc offset in Python.
Using
time.gmtime
you can extract the timezone as described in this previous answer: Get TZ information of the system in Python?.Prints -06:00 for my CST laptop in both python-2.7 and python-3.3 You can also use localtime() to get a local time struct.
Hope this helps