              return value.date()
          if isinstance(value, datetime.date):
              return value
  
          try:
              parsed = parse_date(value)
              if parsed is not None:
                  return parsed
          except (ValueError, TypeError):
              msg = self.error_messages['invalid_date'] % value
              raise ValidationError(msg)
  
          msg = self.error_messages['invalid'] % value
          raise ValidationError(msg)
  
  
 
</s> remove         try:
            parsed = parse_date(value)
            if parsed is not None:
                return datetime.datetime(parsed.year, parsed.month, parsed.day)
        except (ValueError, TypeError):
            msg = self.error_messages['invalid_date'] % value
            raise ValidationError(msg)

        msg = self.error_messages['invalid'] % value
 </s> add         datetime_input_formats = '; '.join(self.format)
        msg = self.error_messages['invalid'] % get_readable_date_format(datetime_input_formats) </s> remove         except (ValueError, TypeError):
            msg = self.error_messages['invalid_datetime'] % value
            raise ValidationError(msg)
 </s> add  </s> remove         try:
            parsed = parse_time(value)
            assert parsed is not None
            return parsed
        except (ValueError, TypeError):
            msg = self.error_messages['invalid'] % value
            raise ValidationError(msg)
 </s> add         for format in self.format:
            try:
                parsed = datetime.datetime.strptime(value, format)
            except (ValueError, TypeError):
                pass
            else:
                return parsed.time()

        time_input_formats = '; '.join(self.format)
        msg = self.error_messages['invalid'] % get_readable_date_format(time_input_formats)
        raise ValidationError(msg) </s> remove         try:
            parsed = parse_datetime(value)
            if parsed is not None:
 </s> add         for format in self.format:
            try:
                parsed = datetime.datetime.strptime(value, format)
            except (ValueError, TypeError):
                pass
            else: </s> remove         msg = self.error_messages['invalid'] % value
 </s> add         date_input_formats = '; '.join(self.format)
        msg = self.error_messages['invalid'] % get_readable_date_format(date_input_formats)
        for format in self.format:
            try:
                parsed = datetime.datetime.strptime(value, format)
            except (ValueError, TypeError):
                pass
            else:
                return parsed.date()
              return value.date()
          if isinstance(value, datetime.date):
              return value
  
        for format in self.format:
            try:
                parsed = datetime.datetime.strptime(value, format)
            except (ValueError, TypeError):
                pass
            else:
                return parsed.date()
        for format in self.format:
            try:
                parsed = datetime.datetime.strptime(value, format)
            except (ValueError, TypeError):
                pass
            else:
                return parsed.date()
        for format in self.format:
            try:
                parsed = datetime.datetime.strptime(value, format)
            except (ValueError, TypeError):
                pass
            else:
                return parsed.date()
        for format in self.format:
            try:
                parsed = datetime.datetime.strptime(value, format)
            except (ValueError, TypeError):
                pass
            else:
                return parsed.date()
        for format in self.format:
            try:
                parsed = datetime.datetime.strptime(value, format)
            except (ValueError, TypeError):
                pass
            else:
                return parsed.date()
        for format in self.format:
            try:
                parsed = datetime.datetime.strptime(value, format)
            except (ValueError, TypeError):
                pass
            else:
                return parsed.date()
        for format in self.format:
            try:
                parsed = datetime.datetime.strptime(value, format)
            except (ValueError, TypeError):
                pass
            else:
                return parsed.date()
  
          msg = self.error_messages['invalid'] % value
          raise ValidationError(msg)
  
  
keep keep keep keep replace replace replace replace replace replace replace keep keep keep keep keep
 Add better date / datetime validation (pull 2)

addition to #631 with update to master + timefield support 
rest_framework/fields.py