diff -up dateutil/zoneinfo/__init__.py\~ dateutil/zoneinfo/__init__.py
--- dateutil/zoneinfo/__init__.py~	2005-12-22 19:13:50.000000000 +0100
+++ dateutil/zoneinfo/__init__.py	2011-08-17 15:24:29.019214748 +0200
@@ -15,6 +15,7 @@ __all__ = ["setcachesize", "gettz", "reb
 
 CACHE = []
 CACHESIZE = 10
+USE_SYSTEM_ZONEINFO = True # XXX configure at build time
 
 class tzfile(tzfile):
     def __reduce__(self):
@@ -29,7 +30,8 @@ def getzoneinfofile():
             return os.path.join(os.path.dirname(__file__), entry)
     return None
 
-ZONEINFOFILE = getzoneinfofile()
+ZONEINFOFILE = getzoneinfofile() if USE_SYSTEM_ZONEINFO else None
+ZONEINFODIR = (os.getenv("TZDIR") or "/usr/share/zoneinfo").rstrip(os.sep)
 
 del getzoneinfofile
 
@@ -39,22 +40,37 @@ def setcachesize(size):
     del CACHE[size:]
 
 def gettz(name):
-    tzinfo = None
-    if ZONEINFOFILE:
-        for cachedname, tzinfo in CACHE:
-            if cachedname == name:
-                break
+    for cachedname, tzinfo in CACHE:
+        if cachedname == name:
+            return tzinfo
+
+    name_parts = name.lstrip('/').split('/')
+    for part in name_parts:
+        if part == os.path.pardir or os.path.sep in part:
+            raise ValueError('Bad path segment: %r' % part)
+    filename = os.path.join(ZONEINFODIR, *name_parts)
+    try:
+        zonefile = open(filename, "rb")
+    except:
+        tzinfo = None
+    else:
+        tzinfo = tzfile(zonefile)
+        zonefile.close()
+
+    if tzinfo is None and ZONEINFOFILE:
+        tf = TarFile.open(ZONEINFOFILE)
+        try:
+            zonefile = tf.extractfile(name)
+        except KeyError:
+            tzinfo = None
         else:
-            tf = TarFile.open(ZONEINFOFILE)
-            try:
-                zonefile = tf.extractfile(name)
-            except KeyError:
-                tzinfo = None
-            else:
-                tzinfo = tzfile(zonefile)
-            tf.close()
-            CACHE.insert(0, (name, tzinfo))
-            del CACHE[CACHESIZE:]
+            tzinfo = tzfile(zonefile)
+        tf.close()
+
+    if tzinfo is not None:
+        CACHE.insert(0, (name, tzinfo))
+        del CACHE[CACHESIZE:]
+
     return tzinfo
 
 def rebuild(filename, tag=None, format="gz"):
