Index: django/db/models/fields/__init__.py
===================================================================
--- django/db/models/fields/__init__.py	(revision 7322)
+++ django/db/models/fields/__init__.py	(working copy)
@@ -562,7 +562,7 @@
         # Casts dates into string format for entry into database.
         if value is not None:
             try:
-                value = value.strftime('%Y-%m-%d')
+                value = "%04.d-%02.d-%02.d" % (value.year,value.month,value.day) # "%Y-%m-%d
             except AttributeError:
                 # If value is already a string it won't have a strftime method,
                 # so we'll just let it pass through.
@@ -574,7 +574,7 @@
 
     def flatten_data(self, follow, obj=None):
         val = self._get_val_from_obj(obj)
-        return {self.attname: (val is not None and val.strftime("%Y-%m-%d") or '')}
+        return {self.attname: (val is not None and ("%04.d-%02.d-%02.d" % (val.year,val.month,val.day)) or '')}
 
     def formfield(self, **kwargs):
         defaults = {'form_class': forms.DateField}
Index: django/core/serializers/json.py
===================================================================
--- django/core/serializers/json.py	(revision 7322)
+++ django/core/serializers/json.py	(working copy)
@@ -46,16 +46,17 @@
     JSONEncoder subclass that knows how to encode date/time and decimal types.
     """
 
-    DATE_FORMAT = "%Y-%m-%d"
-    TIME_FORMAT = "%H:%M:%S"
+    DATE_FORMAT = "%04.d-%02.d-%02.d" # %Y-%m-%d
+    TIME_FORMAT = "%02.d:%02.d:%02.d" # %H:%M:%S
 
     def default(self, o):
         if isinstance(o, datetime.datetime):
-            return o.strftime("%s %s" % (self.DATE_FORMAT, self.TIME_FORMAT))
+            fmt = "%s %s" % (self.DATE_FORMAT, self.TIME_FORMAT)
+            return fmt % (o.year, o.month, o.day, o.hour, o.minute, o.second)
         elif isinstance(o, datetime.date):
-            return o.strftime(self.DATE_FORMAT)
+            return self.DATE_FORMAT % (o.year, o.month, o.day)
         elif isinstance(o, datetime.time):
-            return o.strftime(self.TIME_FORMAT)
+            return self.TIME_FORMAT % (o.hour, o.minute, o.second)
         elif isinstance(o, decimal.Decimal):
             return str(o)
         else:
Index: django/core/serializers/base.py
===================================================================
--- django/core/serializers/base.py	(revision 7322)
+++ django/core/serializers/base.py	(working copy)
@@ -59,7 +59,8 @@
         Convert a field's value to a string.
         """
         if isinstance(field, models.DateTimeField):
-            value = getattr(obj, field.name).strftime("%Y-%m-%d %H:%M:%S")
+            dt = getattr(obj, field.name)
+            value =  "%04.d-%02.d-%02.d %02.d:%02.d:%02.d" % (dt.year,dt.month,dt.day,dt.hour, dt.minute, dt.second)
         else:
             value = field.flatten_data(follow=None, obj=obj).get(field.name, "")
         return smart_unicode(value)
Index: django/core/validators.py
===================================================================
--- django/core/validators.py	(revision 7322)
+++ django/core/validators.py	(working copy)
@@ -141,10 +141,7 @@
     # Could use time.strptime here and catch errors, but datetime.date below
     # produces much friendlier error messages.
     year, month, day = map(int, date_string.split('-'))
-    # This check is needed because strftime is used when saving the date
-    # value to the database, and strftime requires that the year be >=1900.
-    if year < 1900:
-        raise ValidationError, _('Year must be 1900 or later.')
+
     try:
         date(year, month, day)
     except ValueError, e:
Index: tests/regressiontests/serializers_regress/tests.py
===================================================================
--- tests/regressiontests/serializers_regress/tests.py	(revision 7322)
+++ tests/regressiontests/serializers_regress/tests.py	(working copy)
@@ -255,6 +255,9 @@
 
     (data_obj, 800, AutoNowDateTimeData, datetime.datetime(2006,6,16,10,42,37)),
     (data_obj, 810, ModifyingSaveData, 42),
+
+    (data_obj, 900, DateTimeData, datetime.datetime(1,1,1,0,0,0)),
+    (data_obj, 901, DateData, datetime.date(2,2,2)),
 ]
 
 # Because Oracle treats the empty string as NULL, Oracle is expected to fail
