Index: django/newforms/fields.py
===================================================================
--- django/newforms/fields.py	(revision 5489)
+++ django/newforms/fields.py	(working copy)
@@ -516,11 +516,13 @@
         """
         clean_data = []
         errors = ErrorList()
-        if self.required and not value:
-            raise ValidationError(gettext(u'This field is required.'))
-        elif not self.required and not value:
-            return self.compress([])
-        if not isinstance(value, (list, tuple)):
+        if not value or isinstance(value, (list, tuple)):
+            if not value or not [field_value for field_value in value if field_value not in EMPTY_VALUES]:
+                if self.required:
+                    raise ValidationError(gettext(u'This field is required.'))
+                else:
+                    return self.compress([])
+        else:
             raise ValidationError(gettext(u'Enter a list of values.'))
         for i, field in enumerate(self.fields):
             try:
@@ -558,5 +560,11 @@
 
     def compress(self, data_list):
         if data_list:
+            # Raise a validation error if time or date is empty
+            # (possible if SplitDateTimeField has required=False).
+            if data_list[0] in EMPTY_VALUES:
+                raise ValidationError(gettext(u'Enter a valid date.'))
+            if data_list[1] in EMPTY_VALUES:
+                raise ValidationError(gettext(u'Enter a valid time.'))
             return datetime.datetime.combine(*data_list)
         return None
Index: tests/regressiontests/forms/tests.py
===================================================================
--- tests/regressiontests/forms/tests.py	(revision 5489)
+++ tests/regressiontests/forms/tests.py	(working copy)
@@ -1859,8 +1859,12 @@
 >>> f = SplitDateTimeField(required=False)
 >>> f.clean([datetime.date(2006, 1, 10), datetime.time(7, 30)])
 datetime.datetime(2006, 1, 10, 7, 30)
+>>> f.clean(['2006-01-10', '07:30'])
+datetime.datetime(2006, 1, 10, 7, 30)
 >>> f.clean(None)
 >>> f.clean('')
+>>> f.clean([''])
+>>> f.clean(['', ''])
 >>> f.clean('hello')
 Traceback (most recent call last):
 ...
@@ -1877,6 +1881,18 @@
 Traceback (most recent call last):
 ...
 ValidationError: [u'Enter a valid date.']
+>>> f.clean(['2006-01-10', ''])
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a valid time.']
+>>> f.clean(['2006-01-10'])
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a valid time.']
+>>> f.clean(['', '07:30'])
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a valid date.']
 
 #########
 # Forms #
