1
0
mirror of https://github.com/scrapy/scrapy.git synced 2025-02-25 14:23:43 +00:00

Added DateTimeField

This commit is contained in:
Ismael Carnales 2009-05-21 14:57:52 +00:00
parent d5f0cae776
commit c03e246002
2 changed files with 64 additions and 2 deletions

View File

@ -1,10 +1,11 @@
import datetime
import decimal
import re
import time
__all__ = ['MultiValuedField', 'BooleanField', 'DateField', 'DecimalField',
'FloatField', 'IntegerField', 'StringField']
__all__ = ['MultiValuedField', 'BooleanField', 'DateField', 'DateTimeField',
'DecimalField', 'FloatField', 'IntegerField', 'StringField']
class FieldValueError(Exception):
@ -79,6 +80,43 @@ class DateField(Field):
raise FieldValueError("Invalid date: %s" % str(e))
class DateTimeField(Field):
def to_python(self, value):
if value is None:
return value
if isinstance(value, datetime.datetime):
return value
if isinstance(value, datetime.date):
return datetime.datetime(value.year, value.month, value.day)
# Attempt to parse a datetime:
value = str(value)
# split usecs, because they are not recognized by strptime.
if '.' in value:
try:
value, usecs = value.split('.')
usecs = int(usecs)
except ValueError:
raise FieldValueError('Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format.')
else:
usecs = 0
kwargs = {'microsecond': usecs}
try: # Seconds are optional, so try converting seconds first.
return datetime.datetime(*time.strptime(value, '%Y-%m-%d %H:%M:%S')[:6],
**kwargs)
except ValueError:
try: # Try without seconds.
return datetime.datetime(*time.strptime(value, '%Y-%m-%d %H:%M')[:5],
**kwargs)
except ValueError: # Try without hour/minutes/seconds.
try:
return datetime.datetime(*time.strptime(value, '%Y-%m-%d')[:3],
**kwargs)
except ValueError:
raise FieldValueError('Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format.')
class DecimalField(Field):
def to_python(self, value):
if value is None:

View File

@ -56,6 +56,30 @@ class NewItemFieldsTest(unittest.TestCase):
i.field = '2009-05-21'
assert i.field == datetime.date(2009, 5, 21)
def test_datetime_field(self):
class TestItem(Item):
field = DateTimeField()
i = TestItem()
dt_today = datetime.datetime.today()
i.field = dt_today
assert i.field == dt_today
d_today = datetime.date.today()
i.field = d_today
assert i.field == datetime.datetime(d_today.year, d_today.month,
d_today.day)
i.field = '2009-05-21 11:08:10'
assert i.field == datetime.datetime(2009, 5, 21, 11, 8, 10)
i.field = '2009-05-21 11:08'
assert i.field == datetime.datetime(2009, 5, 21, 11, 8)
i.field = '2009-05-21'
assert i.field == datetime.datetime(2009, 5, 21)
def test_decimal_field(self):
class TestItem(Item):
field = DecimalField()