0

I am trying to build a function as follows:

Input

  • UTC timestamp in miliseconds, for example:

1456865863633

  • UTC offset, or miliseconds to add/substract to the UTC timestamp to obtain the time in the corresponding timezone, for example:

-14400

OutPut Time zone name in the following format:

US/Alaska
US/Aleutian
US/Arizona
US/Central
US/East-Indiana
US/Eastern
US/Hawaii
.
.
.

I've been trying to find the rught combination to do it using datetime and pytz libraries, but I was not successful so far.

Any ideas?

Salias
  • 480
  • 6
  • 19
  • Many timezones have the same UTC offset, which makes it easy to go from timezone to offset, but not from offset to timezone. What behaviour would you want when multiple timezones are found for a given offset? – practual May 10 '16 at 19:10
  • I would like to know which areas of the world that correspond to a given offset from UTC, so I would like to retrieve all the timezones names available in a list. – Salias May 11 '16 at 08:55
  • Cool, then unutbu's answer looks good. – practual May 11 '16 at 14:24
  • related: [pytz: return Olson Timezone name from only a GMT Offset](http://stackoverflow.com/q/30315485/4279) – jfs May 11 '16 at 23:43

2 Answers2

2

You could loop through all the timezones

for name in pytz.all_timezones:

and compare the date's utcoffset to the given offset:

if date.utcoffset().total_seconds() == utcoffset:
    result.append(name)

import datetime as DT
import pytz
utc = pytz.utc
def tzones(timestamp, utcoffset):
    result = []
    date = utc.localize(DT.datetime.utcfromtimestamp(timestamp/float(1000)))
    for name in pytz.all_timezones:
        timezone = pytz.timezone(name)
        date = date.astimezone(timezone)
        if date.utcoffset().total_seconds() == utcoffset:
            result.append(name)
    return result

print(tzones(1456865863633, -14400))

prints

['America/Anguilla', 'America/Antigua', 'America/Aruba', 'America/Barbados', 'America/Blanc-Sablon', 'America/Boa_Vista', 'America/Campo_Grande', 'America/Cuiaba', 'America/Curacao', 'America/Dominica', 'America/Glace_Bay', 'America/Goose_Bay', 'America/Grand_Turk', 'America/Grenada', 'America/Guadeloupe', 'America/Guyana', 'America/Halifax', 'America/Kralendijk', 'America/La_Paz', 'America/Lower_Princes', 'America/Manaus', 'America/Marigot', 'America/Martinique', 'America/Moncton', 'America/Montserrat', 'America/Port_of_Spain', 'America/Porto_Velho', 'America/Puerto_Rico', 'America/Santo_Domingo', 'America/St_Barthelemy', 'America/St_Kitts', 'America/St_Lucia', 'America/St_Thomas', 'America/St_Vincent', 'America/Thule', 'America/Tortola', 'America/Virgin', 'Atlantic/Bermuda', 'Brazil/West', 'Canada/Atlantic', 'Etc/GMT+4']
unutbu
  • 842,883
  • 184
  • 1,785
  • 1,677
1

Here's a different implementation of the approach from @unutbu's answer:

from datetime import datetime
import pytz

def timezones_from_utc_offset(offset, now=None):
    if now is None:
        now = datetime.now(pytz.utc)
    return {tz.zone for tz in map(pytz.timezone, pytz.all_timezones_set)
            if now.astimezone(tz).utcoffset() == offset}

If the input is the POSIX time in milliseconds:

>>> from datetime import timedelta
>>> dt = datetime(1970,1,1,tzinfo=pytz.utc) + timedelta(milliseconds=1456865863633)
>>> timezones_from_utc_offset(offset=timedelta(seconds=-14400), now=dt)
{'America/Anguilla',
 'America/Antigua',
 'America/Aruba',
 'America/Barbados',
 'America/Blanc-Sablon',
 'America/Boa_Vista',
 'America/Campo_Grande',
 'America/Cuiaba',
 'America/Curacao',
 'America/Dominica',
 'America/Glace_Bay',
 'America/Goose_Bay',
 'America/Grand_Turk',
 'America/Grenada',
 'America/Guadeloupe',
 'America/Guyana',
 'America/Halifax',
 'America/Kralendijk',
 'America/La_Paz',
 'America/Lower_Princes',
 'America/Manaus',
 'America/Marigot',
 'America/Martinique',
 'America/Moncton',
 'America/Montserrat',
 'America/Port_of_Spain',
 'America/Porto_Velho',
 'America/Puerto_Rico',
 'America/Santo_Domingo',
 'America/St_Barthelemy',
 'America/St_Kitts',
 'America/St_Lucia',
 'America/St_Thomas',
 'America/St_Vincent',
 'America/Thule',
 'America/Tortola',
 'America/Virgin',
 'Atlantic/Bermuda',
 'Brazil/West',
 'Canada/Atlantic',
 'Etc/GMT+4'}
Community
  • 1
  • 1
jfs
  • 399,953
  • 195
  • 994
  • 1,670