Get timezone abbreviation from UTC offset

前端 未结 3 1882
独厮守ぢ
独厮守ぢ 2020-12-04 02:41

I have the UTC offset in my DB for the users:

+5:30 

How can I get the timezone abbreviation from this UTC offset using Python?

Suc

相关标签:
3条回答
  • This is not possible.

    • There are many time zones that share the same offset. See this Wikipedia article for details.

    • There is no uniform standard for time zone abbreviations. There are some listed here and here, and you can see that there are duplicates in both directions.

      For example:

      • CST might be -5:00, -6:00, +8:00, +9:30 or +10:30.
      • -10:00 could be HST, HAST, TAHT, or CKT

    Read also the section "Time Zone != Offset" of the timezone tag wiki here on StackOverflow.

    0 讨论(0)
  • 2020-12-04 03:12

    As Matt stated, going from offset to timezone does not make a lot of sense.

    In case you were looking to find an appropriate pytz.timezone object for a given offset:

    there are timezones ranging from "Etc/GMT-14" to "Etc/GMT+12"

    just take a look at pytz.all_timezones.

    Using those, I was able to use faulty client input (mistaking timezone for offset) to attach a valid timezone object to my user.

    0 讨论(0)
  • 2020-12-04 03:14

    You can get a set (zero or more) of timezone abbreviations (as specified in the tz database) that corresponds to the given UTC offset now:

    #!/usr/bin/env python
    from datetime import datetime, timedelta
    import pytz # $ pip install pytz
    
    utc_offset = timedelta(hours=5, minutes=30) # +5:30
    now = datetime.now(pytz.utc) # current time
    print({now.astimezone(tz).tzname() 
           for tz in map(pytz.timezone, pytz.all_timezones_set)
           if now.astimezone(tz).utcoffset() == utc_offset})
    

    Output

    set(['IST'])
    

    If you want to get abbreviations including the historical data:

    #!/usr/bin/env python
    from datetime import datetime, timedelta
    import pytz # $ pip install pytz
    
    utc_offset = timedelta(hours=5, minutes=30) # +5:30
    abbr = set()
    now = datetime.now(pytz.utc)
    for tz in map(pytz.timezone, pytz.all_timezones_set):
        dt = now.astimezone(tz)    
        tzinfos = getattr(tz, '_tzinfos',
                          [(dt.utcoffset(), dt.dst(), dt.tzname())])
        abbr.update(tzname for off, _, tzname in tzinfos if off == utc_offset)
    print(abbr)
    

    Output

    set(['IST'])
    
    0 讨论(0)
提交回复
热议问题