Index: django/db/models/fields/__init__.py
===================================================================
--- django/db/models/fields/__init__.py	(revision 5272)
+++ django/db/models/fields/__init__.py	(working copy)
@@ -573,6 +573,38 @@
         defaults.update(kwargs)
         return super(DateTimeField, self).formfield(**defaults)
 
+class DurationField(Field):
+    max_digits, decimal_places = 20, 6
+
+    def get_internal_type(self):
+        return "FloatField"
+
+    def get_db_prep_save(self, value):
+        return str(value.days * 24 * 3600 + value.seconds + float(value.microseconds) / 1000000)
+
+    def to_python(self, value):
+        if isinstance(value, datetime.timedelta):
+            return value
+        try:
+            return datetime.timedelta(seconds=float(value))
+        except (TypeError, ValueError):
+            raise validators.ValidationError('This value must be a real number.')
+        except OverflowError:
+            raise validators.ValidationError('The maximum allowed value is %s' % datetime.timedelta.max)
+
+    def coerce(self, value):
+        return self.to_python(value)
+
+    def flatten_data(self, follow, obj=None):
+        val = self._get_val_from_obj(obj)
+        return {self.attname: (val is not None and self.get_db_prep_save(val) or '')}
+
+    def formfield(self, form_class=forms.SplitDurationField, **kwargs):
+        return super(DurationField, self).formfield(form_class, **kwargs)
+
+    def get_manipulator_field_objs(self):
+        return [curry(oldforms.FloatField, max_digits=self.max_digits, decimal_places=self.decimal_places)]
+
 class EmailField(CharField):
     def __init__(self, *args, **kwargs):
         kwargs['maxlength'] = 75
Index: django/newforms/fields.py
===================================================================
--- django/newforms/fields.py	(revision 5272)
+++ django/newforms/fields.py	(working copy)
@@ -10,7 +10,7 @@
 from django.utils.encoding import smart_unicode
 
 from util import ErrorList, ValidationError
-from widgets import TextInput, PasswordInput, HiddenInput, MultipleHiddenInput, CheckboxInput, Select, NullBooleanSelect, SelectMultiple
+from widgets import TextInput, PasswordInput, HiddenInput, MultipleHiddenInput, CheckboxInput, Select, NullBooleanSelect, SelectMultiple, SplitDurationWidget
 
 __all__ = (
     'Field', 'CharField', 'IntegerField',
@@ -20,7 +20,7 @@
     'RegexField', 'EmailField', 'URLField', 'BooleanField',
     'ChoiceField', 'NullBooleanField', 'MultipleChoiceField',
     'ComboField', 'MultiValueField',
-    'SplitDateTimeField',
+    'SplitDateTimeField', 'SplitDurationField',
 )
 
 # These values, if given to to_python(), will trigger the self.required check.
@@ -494,3 +494,29 @@
         if data_list:
             return datetime.datetime.combine(*data_list)
         return None
+
+class SplitDurationField(MultiValueField):
+    widget = SplitDurationWidget
+
+    def __init__(self, *args, **kwargs):
+        fields = (
+            IntegerField(label='Days', max_value=999999999, min_value=-999999999),
+            IntegerField(label='Hours', max_value=23, min_value=0),
+            IntegerField(label='Minutes', max_value=59, min_value=0),
+            IntegerField(label='Seconds', max_value=59, min_value=0),
+            IntegerField(label='Microseconds', max_value=999999, min_value=0),
+        )
+        super(SplitDurationField, self).__init__(fields, *args, **kwargs)
+
+    def compress(self, data_list):
+        if data_list == [None] * 5:
+            raise ValidationError(gettext(u'This field is required.'))
+        if data_list:
+            return datetime.timedelta(
+                days=data_list[0] or 0,
+                hours=data_list[1] or 0,
+                minutes=data_list[2] or 0,
+                seconds=data_list[3] or 0,
+                microseconds=data_list[4] or 0,
+            )
+        return None
Index: django/newforms/widgets.py
===================================================================
--- django/newforms/widgets.py	(revision 5272)
+++ django/newforms/widgets.py	(working copy)
@@ -21,6 +21,7 @@
     'FileInput', 'Textarea', 'CheckboxInput',
     'Select', 'NullBooleanSelect', 'SelectMultiple', 'RadioSelect',
     'CheckboxSelectMultiple', 'MultiWidget', 'SplitDateTimeWidget',
+    'SplitDurationWidget',
 )
 
 class Widget(object):
@@ -374,3 +375,25 @@
         if value:
             return [value.date(), value.time()]
         return [None, None]
+
+class SplitDurationWidget(MultiWidget):
+    def __init__(self, attrs=None):
+        attrs = attrs or {}
+        widgets = (
+            TextInput(attrs=dict(attrs, size=4, maxlength=10, title='Days')),
+            TextInput(attrs=dict(attrs, size=1, maxlength=2, title='Hours')),
+            TextInput(attrs=dict(attrs, size=1, maxlength=2, title='Minutes')),
+            TextInput(attrs=dict(attrs, size=1, maxlength=2, title='Seconds')),
+            TextInput(attrs=dict(attrs, size=5, maxlength=6, title='Microseconds')),
+        )
+        super(SplitDurationWidget, self).__init__(widgets, attrs)
+
+    def decompress(self, value):
+        if value:
+            hours, seconds = divmod(value.seconds, 3600)
+            minutes, seconds = divmod(seconds, 60)
+            return [value.days, hours, minutes, seconds, value.microseconds]
+        return [None, None, None, None, None]
+
+    def format_output(self, rendered_widgets):
+        return u'%s days, %s : %s : %s . %s' % tuple(rendered_widgets)
