Getting computer's UTC offset in Python
In Python, how do you find what UTC time offset the computer is set to?
gmtime() will return the UTC time and localtime() will return the local time so subtracting the two should give you the utc offset.
import time print -time.timezone
It prints UTC offset in seconds (to take into account Daylight Saving Time (DST) see time.altzone:
is_dst = time.daylight and time.localtime().tm_isdst > 0 utc_offset = - (time.altzone if is_dst else time.timezone)
where utc offset is defined via: "To get local time, add utc offset to utc time."
In Python 3.3+ there is tm_gmtoff attribute if underlying C library supports it:
utc_offset = time.localtime().tm_gmtoff
Note: time.daylight may give a wrong result in some edge cases.
tm_gmtoff is used automatically by datetime if it is available on Python 3.3+:
from datetime import datetime, timedelta, timezone d = datetime.now(timezone.utc).astimezone() utc_offset = d.utcoffset() // timedelta(seconds=1)
To get the current UTC offset in a way that workarounds the time.daylight issue and that works even if tm_gmtoff is not available, @jts's suggestion to substruct the local and UTC time can be used:
import time from datetime import datetime ts = time.time() utc_offset = (datetime.fromtimestamp(ts) - datetime.utcfromtimestamp(ts)).total_seconds()
To get UTC offset for past/future dates, pytz timezones could be used:
from datetime import datetime from tzlocal import get_localzone # $ pip install tzlocal tz = get_localzone() # local timezone d = datetime.now(tz) # or some other local date utc_offset = d.utcoffset().total_seconds()
It works during DST transitions, it works for past/future dates even if the local timezone had different UTC offset at the time e.g., Europe/Moscow timezone in 2010-2015 period.
>>> strftime('%z') '-0700'
I tried JTS' answer first, but it gave me the wrong result. I'm in -0700 now, but it was saying I was in -0800. But I had to do some conversion before I could get something I could subtract, so maybe the answer was more incomplete than incorrect.
hours_delta = (time.mktime(time.localtime()) - time.mktime(time.gmtime())) / 60 / 60
Create a Unix Timestamp with UTC Corrected Timezone
This simple function will make it easy for you to get the current time from a MySQL/PostgreSQL database date object.
def timestamp(date='2018-05-01'): return int(time.mktime( datetime.datetime.strptime( date, "%Y-%m-%d" ).timetuple() )) + int(time.strftime('%z')) * 6 * 6
>>> timestamp('2018-05-01') 1525132800 >>> timestamp('2018-06-01') 1527811200
Here is some python3 code with just datetime and time as imports. HTH
>>> from datetime import datetime >>> import time >>> def date2iso(thedate): ... strdate = thedate.strftime("%Y-%m-%dT%H:%M:%S") ... minute = (time.localtime().tm_gmtoff / 60) % 60 ... hour = ((time.localtime().tm_gmtoff / 60) - minute) / 60 ... utcoffset = "%.2d%.2d" %(hour, minute) ... if utcoffset != '-': ... utcoffset = '+' + utcoffset ... return strdate + utcoffset ... >>> date2iso(datetime.fromtimestamp(time.time())) '2015-04-06T23:56:30-0400'
This works for me:
if time.daylight > 0: return time.altzone else: return time.timezone