# APOLOGY (was: pytz has so many timezones!)

mensanator at aol.com mensanator at aol.com
Wed Oct 10 08:18:16 CEST 2007

```I apologize for being a dick. It won't happen again.

I was actually thinking that the 25 standard
timezones (which make a reasonable list or
can be easily generated by clicking a map)
could serve as a filter to make the detail
list reasonably sized.

Something like this:

import pytz
import datetime
import sqlite3
import random

utc = pytz.timezone('UTC')
utc_dt = datetime.datetime(2007,1,1,0,0,0,tzinfo=utc)
offset_zone = []

for i in pytz.all_timezones:
the_zone = pytz.timezone(i)
loc_dt = utc_dt.astimezone(the_zone)
loc_offset = loc_dt.strftime('%z')
offset_zone.append((loc_offset,the_zone.zone))

con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.executescript("""
create table tz(
offset,
zone
);
""")

cur.executemany("""
INSERT INTO tz(offset,
zone)
VALUES      (?,?)"""
, offset_zone)

cur.execute("""
SELECT DISTINCT offset
FROM  tz
WHERE offset LIKE '+%'
ORDER BY offset;
""")

east = cur.fetchall()

cur.execute("""
SELECT DISTINCT offset
FROM  tz
WHERE offset LIKE '-%'
ORDER BY offset DESC;
""")

west = cur.fetchall()

distinct_offsets = east + west

print
for i in distinct_offsets:
if i[0]=='+0000' or i[0]=='+0600' or i[0]=='+1200' or i[0]=='-1200'
or i[0]=='-0600':
print
print i[0],

print
print

the_choice = random.choice(distinct_offsets)

print 'Offset',the_choice[0],'chosen.'
print

cur.execute("""
SELECT offset,
zone
FROM   tz
WHERE offset=?
ORDER BY offset;
""",the_choice)

list_o_zones = cur.fetchall()

print 'Which timezone?'
print

for i in list_o_zones: print i[0],i[1]

##
##  +0000 +0100 +0200 +0300 +0330 +0400 +0430 +0500 +0530 +0545
##  +0600 +0630 +0700 +0800 +0900 +0930 +0945 +1000 +1030 +1100 +1130
##  +1200 +1300 +1345 +1400
##  -1200 -1100 -1000 -0930 -0900 -0800 -0700
##  -0600 -0500 -0400 -0330 -0300 -0200 -0100
##
##  Offset -0930 chosen.
##
##  Which timezone?
##
##  -0930 Pacific/Marquesas
##
##
##
##
##  +0000 +0100 +0200 +0300 +0330 +0400 +0430 +0500 +0530 +0545
##  +0600 +0630 +0700 +0800 +0900 +0930 +0945 +1000 +1030 +1100 +1130
##  +1200 +1300 +1345 +1400
##  -1200 -1100 -1000 -0930 -0900 -0800 -0700
##  -0600 -0500 -0400 -0330 -0300 -0200 -0100
##
##  Offset +0945 chosen.
##
##  Which timezone?
##
##  +0945 Australia/Eucla
##
##
##
##
##  +0000 +0100 +0200 +0300 +0330 +0400 +0430 +0500 +0530 +0545
##  +0600 +0630 +0700 +0800 +0900 +0930 +0945 +1000 +1030 +1100 +1130
##  +1200 +1300 +1345 +1400
##  -1200 -1100 -1000 -0930 -0900 -0800 -0700
##  -0600 -0500 -0400 -0330 -0300 -0200 -0100
##
##  Offset -0100 chosen.
##
##  Which timezone?
##
##  -0100 America/Scoresbysund
##  -0100 Atlantic/Azores
##  -0100 Atlantic/Cape_Verde
##  -0100 Etc/GMT+1
##
##
##
##
##  +0000 +0100 +0200 +0300 +0330 +0400 +0430 +0500 +0530 +0545
##  +0600 +0630 +0700 +0800 +0900 +0930 +0945 +1000 +1030 +1100 +1130
##  +1200 +1300 +1345 +1400
##  -1200 -1100 -1000 -0930 -0900 -0800 -0700
##  -0600 -0500 -0400 -0330 -0300 -0200 -0100
##
##  Offset +1000 chosen.
##
##  Which timezone?
##
##  +1000 Antarctica/DumontDUrville
##  +1000 Asia/Sakhalin
##  +1000 Australia/Brisbane
##  +1000 Australia/Lindeman
##  +1000 Australia/Queensland
##  +1000 Etc/GMT-10
##  +1000 Pacific/Guam
##  +1000 Pacific/Port_Moresby
##  +1000 Pacific/Saipan
##  +1000 Pacific/Truk
##  +1000 Pacific/Yap
##
##
##
##
##  +0000 +0100 +0200 +0300 +0330 +0400 +0430 +0500 +0530 +0545
##  +0600 +0630 +0700 +0800 +0900 +0930 +0945 +1000 +1030 +1100 +1130
##  +1200 +1300 +1345 +1400
##  -1200 -1100 -1000 -0930 -0900 -0800 -0700
##  -0600 -0500 -0400 -0330 -0300 -0200 -0100
##
##  Offset +0300 chosen.
##
##  Which timezone?
##
##  +0300 Africa/Asmara
##  +0300 Africa/Asmera
##  +0300 Africa/Dar_es_Salaam
##  +0300 Africa/Djibouti
##  +0300 Africa/Kampala
##  +0300 Africa/Khartoum
##  +0300 Africa/Nairobi
##  +0300 Antarctica/Syowa
##  +0300 Asia/Bahrain
##  +0300 Asia/Kuwait
##  +0300 Asia/Qatar
##  +0300 Etc/GMT-3
##  +0300 Europe/Moscow
##  +0300 Indian/Antananarivo
##  +0300 Indian/Comoro
##  +0300 Indian/Mayotte
##  +0300 W-SU

##
##  +0000 +0100 +0200 +0300 +0330 +0400 +0430 +0500 +0530 +0545
##  +0600 +0630 +0700 +0800 +0900 +0930 +0945 +1000 +1030 +1100 +1130
##  +1200 +1300 +1345 +1400
##  -1200 -1100 -1000 -0930 -0900 -0800 -0700
##  -0600 -0500 -0400 -0330 -0300 -0200 -0100
##
##  Offset -0600 chosen.
##
##  Which timezone?
##
##  -0600 America/Belize
##  -0600 America/Cancun
##  -0600 America/Chicago
##  -0600 America/Costa_Rica
##  -0600 America/Guatemala
##  -0600 America/Indiana/Knox
##  -0600 America/Indiana/Petersburg
##  -0600 America/Indiana/Tell_City
##  -0600 America/Indiana/Vincennes
##  -0600 America/Indiana/Winamac
##  -0600 America/Knox_IN
##  -0600 America/Managua
##  -0600 America/Menominee
##  -0600 America/Merida
##  -0600 America/Mexico_City
##  -0600 America/Monterrey
##  -0600 America/North_Dakota/Center
##  -0600 America/North_Dakota/New_Salem
##  -0600 America/Rainy_River
##  -0600 America/Rankin_Inlet
##  -0600 America/Regina
##  -0600 America/Swift_Current
##  -0600 America/Tegucigalpa
##  -0600 America/Winnipeg
##  -0600 CST6CDT
##  -0600 Etc/GMT+6
##  -0600 Mexico/General
##  -0600 Pacific/Galapagos
##  -0600 US/Central
##  -0600 US/Indiana-Starke

Why do all the Etc/GMTxxx zones appear to have
the sign of their offset reversed? Such as
-0600 for Etc/GMT+6?

```