Search code examples
pythonwindowsoffsetutcstrftime

Python: strftime() UTC Offset Not working as Expected in Windows


Every time I use:

time.strftime("%z")

I get:

Eastern Daylight Time

However, I would like the UTC offset in the form +HHMM or -HHMM. I have even tried:

time.strftime("%Z")

Which still yields:

Eastern Daylight Time

I have read several other posts related to strftime() and %z always seems to return the UTC offset in the proper +HHMM or -HHMM format. How do I get strftime() to output in the +HHMM or -HHMM format for python 3.3?

Edit: I'm running Windows 7


Solution

  • For a proper solution, see abarnert’s answer below.


    You can use time.altzone which returns a negative offset in seconds. For example, I’m on CEST at the moment (UTC+2), so I get this:

    >>> time.altzone
    -7200
    

    And to put it in your desired format:

    >>> '{}{:0>2}{:0>2}'.format('-' if time.altzone > 0 else '+', abs(time.altzone) // 3600, abs(time.altzone // 60) % 60)
    '+0200'
    

    As abarnert mentioned in the comments, time.altzone gives the offset when DST is active while time.timezone does for when DST is not active. To figure out which to use, you can do what J.F. Sebastian suggested in his answer to a different question. So you can get the correct offset like this:

    time.altzone if time.daylight and time.localtime().tm_isdst > 0 else time.timezone
    

    As also suggested by him, you can use the following in Python 3 to get the desired format using datetime.timezone:

    >>> datetime.now(timezone.utc).astimezone().strftime('%z')
    '+0200'