Index: main/waeup.kofa/trunk/src/waeup/kofa/widgets/datetimewidget.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/widgets/datetimewidget.py	(revision 8206)
+++ main/waeup.kofa/trunk/src/waeup/kofa/widgets/datetimewidget.py	(revision 8207)
@@ -20,5 +20,18 @@
 import datetime
 import pytz
+from zope.component import queryUtility
+from zope.datetime import parseDatetimetz
+from zope.datetime import DateTimeError
+from zope.formlib.i18n import _
+from zope.formlib.interfaces import ConversionError
 from zope.formlib.textwidgets import DatetimeWidget
+from waeup.kofa.utils.helpers import to_timezone
+from waeup.kofa.interfaces import IKofaUtils
+
+class _DummyUtils(object):
+    tzinfo = pytz.utc
+
+# A fallback, if no IKofaUtils can be found
+_DUMMY_UTILS = _DummyUtils()
 
 class PytzDatetimeWidget(DatetimeWidget):
@@ -38,4 +51,10 @@
     go into the DB.
 
+    For datetimes without any timezone set, we interpret the input to
+    be meant as local app-time. I.e. if application TZ is
+    ``Africa/Lagos``, we assume that a string like '2012-02-01 12:13'
+    (apparently not providing TZ info) was meant as 12:13 h Lagos
+    time.
+
     From zope.datetime, however, we save the parser abilities to
     interpret even bizarre entered data as some datetime.
@@ -47,8 +66,20 @@
 
         """
-        value = super(PytzDatetimeWidget, self)._toFieldValue(string)
+        if string == self._missing:
+            return self.context.missing_value
+        else:
+            try:
+                # Different to original implementation we do not
+                # automatically request local server time if no TZ was
+                # set in `string`. In this case we want a datetime with
+                # tzinfo set to `None` instead.
+                value = parseDatetimetz(string, local=False)
+            except (DateTimeError, ValueError, IndexError), v:
+                raise ConversionError(_("Invalid datetime data"), v)
+
         if not isinstance(value, datetime.datetime):
             return value
         if value.tzinfo is None:
-            return pytz.utc.localize(value)
+            utils = queryUtility(IKofaUtils, default=_DUMMY_UTILS)
+            value = utils.tzinfo.localize(value)
         return value.astimezone(pytz.utc)
Index: main/waeup.kofa/trunk/src/waeup/kofa/widgets/tests/test_datetimewidget.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/widgets/tests/test_datetimewidget.py	(revision 8206)
+++ main/waeup.kofa/trunk/src/waeup/kofa/widgets/tests/test_datetimewidget.py	(revision 8207)
@@ -3,4 +3,5 @@
 import pytz
 from zope import schema
+from zope.component import getGlobalSiteManager
 from zope.formlib import form
 from zope.formlib.interfaces import IInputWidget, IDisplayWidget
@@ -11,4 +12,5 @@
 from zope.interface.verify import verifyClass, verifyObject
 from zope.publisher.browser import TestRequest
+from waeup.kofa.interfaces import IKofaUtils
 from waeup.kofa.widgets.datetimewidget import PytzDatetimeWidget
 
@@ -25,4 +27,10 @@
     form_fields = form.fields(IContent)
     form_fields['my_dt'].custom_widget = PytzDatetimeWidget
+
+class FakeUtils(object):
+    # Fake app-wide set timezone.
+    implements(IKofaUtils)
+    tzinfo = pytz.timezone('America/Sao_Paulo')
+
 
 class PytzDatetimeWidgetTests(FunctionalWidgetTestCase):
@@ -66,2 +74,29 @@
         self.assertTrue(content.my_dt.tzinfo is pytz.utc)
         return
+
+    def setUp(self):
+        super(PytzDatetimeWidgetTests, self).setUp()
+        self.gsm = getGlobalSiteManager()
+        self.utils = FakeUtils()
+        self.gsm.registerUtility(self.utils)
+        return
+
+    def tearDown(self):
+        super(PytzDatetimeWidgetTests, self).tearDown()
+        self.gsm.unregisterUtility(self.utils)
+        return
+
+    def test_datetimes_wo_tz(self):
+        # Datetimes w/o tz are considered to be meant in app-wide timezone.
+        content = Content()
+        request = TestRequest()
+
+        request.form['form.my_dt'] = u'2011-11-11 11:11:11'
+        request.form['form.actions.apply'] = u''
+        SampleForm(content, request)()
+
+        # Sao Paulo was two hours back UTC on 2011-11-11
+        self.assertEqual(content.my_dt, datetime.datetime(
+            2011, 11, 11, 13, 11, 11, tzinfo=pytz.utc))
+        self.assertTrue(content.my_dt.tzinfo is pytz.utc)
+        return
