diff --git a/trac/util/datefmt.py b/trac/util/datefmt.py
--- a/trac/util/datefmt.py
+++ b/trac/util/datefmt.py
@@ -41,14 +41,15 @@
 
     Any other input will trigger a `TypeError`.
     """
+    tzinfo = tzinfo or localtz
     if t is None:
-        return datetime.now(tzinfo or localtz)
+        return tzinfo.localize(datetime.now())
     elif isinstance(t, datetime):
         return t
     elif isinstance(t, date):
-        return datetime(t.year, t.month, t.day, tzinfo=tzinfo or localtz)
+        return tzinfo.localize(datetime(t.year, t.month, t.day))
     elif isinstance(t, (int,long,float)):
-        return datetime.fromtimestamp(t, tzinfo or localtz)
+        return tzinfo.localize(datetime.fromtimestamp(t))
     raise TypeError('expecting datetime, int, long, float, or None; got %s' %
                     type(t))
 
@@ -232,7 +233,7 @@
         raise TracError('"%s" is an invalid date, or the date format '
                         'is not known. Try "%s" instead.' % (text, hint),
                         'Invalid Date')
-    dt = datetime(*(tm[0:6] + (0, tzinfo)))
+    dt = tzinfo.localize(datetime(*tm[0:6]))
     # Make sure we can convert it to a timestamp and back - fromtimestamp()
     # may raise ValueError if larger than platform C localtime() or gmtime()
     try:
@@ -268,6 +269,9 @@
     def dst(self, dt):
         return _zero
 
+    def localize(self, dt, is_dst=False):
+        return dt.replace(tzinfo=self)
+
 
 STDOFFSET = timedelta(seconds=-time.timezone)
 if time.daylight:
@@ -307,6 +311,9 @@
         except OverflowError:
             return False
 
+    def localize(self, dt, is_dst=False):
+        return dt.replace(tzinfo=self)
+
 
 utc = FixedOffset(0, 'UTC')
 utcmin = datetime.min.replace(tzinfo=utc)
diff --git a/trac/util/tests/datefmt.py b/trac/util/tests/datefmt.py
--- a/trac/util/tests/datefmt.py
+++ b/trac/util/tests/datefmt.py
@@ -42,6 +42,19 @@
                              tz.utcoffset(None))
             self.assertEqual('GMT +4:00', tz.zone)
 
+        def test_parse_date(self):
+            tz = datefmt.get_timezone('Europe/Zurich')
+            t = datefmt.parse_date('2009-12-01T12:00:00', tz)
+            t_utc = datetime.datetime(2009, 12, 1, 11, 0, 0, 0, datefmt.utc)
+            self.assertEqual(t_utc, t)
+
+        def test_parse_date_dst(self):
+            tz = datefmt.get_timezone('Europe/Zurich')
+            t = datefmt.parse_date('2009-08-01T12:00:00', tz)
+            t_utc = datetime.datetime(2009, 8, 1, 10, 0, 0, 0, datefmt.utc)
+            self.assertEqual(t_utc, t)
+
+
 class DateFormatTestCase(unittest.TestCase):
 
     def test_to_datetime(self):
@@ -93,6 +106,7 @@
         self.assertEqual('2009-08-20', 
                          datefmt.format_date(a_date, format='%Y-%m-%d'))
 
+
 def suite():
     suite = unittest.TestSuite()
     if PytzTestCase:

