def testLeap(self): self.assertRaises(DateTimeError, parse, '1999-2-29 1:2:3.456') self.assertRaises(DateTimeError, parse, '1900-2-29 1:2:3.456') self.assertEqual(parse('2000-02-29 1:2:3')[:6], (2000, 2, 29, 1, 2, 3)) self.assertEqual(parse('2004-02-29 1:2:3')[:6], (2004, 2, 29, 1, 2, 3))
def _parseInput(self, input): """Convert a string to a datetime value. >>> from zope.publisher.browser import TestRequest >>> from zope.schema import Field >>> field = Field(__name__='foo', title=u'Foo') >>> widget = DateTimeWidget(field, TestRequest()) >>> widget.required_time_zone = pytz.timezone('UTC') >>> widget.time_zone <UTC> The widget converts an empty string to the missing value: >>> widget._parseInput('') == field.missing_value True The widget prints out times in UTC: >>> print widget._parseInput('2006-01-01 12:00:00') 2006-01-01 12:00:00+00:00 But it will handle other time zones: >>> widget.required_time_zone = pytz.timezone('Australia/Perth') >>> print widget._parseInput('2006-01-01 12:00:00') 2006-01-01 12:00:00+08:00 Invalid dates result in a ConversionError: >>> print widget._parseInput('not a date') #doctest: +ELLIPSIS Traceback (most recent call last): ... ConversionError: ('Invalid date value', ...) """ if input == self._missing: return self.context.missing_value self._checkSupportedFormat(input) try: year, month, day, hour, minute, second, dummy_tz = parse(input) second, micro = divmod(second, 1.0) micro = round(micro * 1000000) dt = datetime(year, month, day, hour, minute, int(second), int(micro)) except (DateTimeError, ValueError, IndexError) as v: raise ConversionError('Invalid date value', v) return self.time_zone.localize(dt)
def _toFieldValue(self, input): """Convert a string to a datetime value. >>> from zope.publisher.browser import TestRequest >>> from zope.schema import Field >>> field = Field(__name__='foo', title=u'Foo') >>> widget = LocalDateTimeWidget(field, TestRequest()) The widget converts an empty string to the missing value: >>> widget._toFieldValue('') == field.missing_value True By default, the date is interpreted as UTC: >>> print widget._toFieldValue('2006-01-01 12:00:00') 2006-01-01 12:00:00+00:00 But it will handle other time zones: >>> widget.timeZoneName = 'Australia/Perth' >>> print widget._toFieldValue('2006-01-01 12:00:00') 2006-01-01 12:00:00+08:00 Invalid dates result in a ConversionError: >>> print widget._toFieldValue('not a date') #doctest: +ELLIPSIS Traceback (most recent call last): ... ConversionError: ('Invalid date value', ...) """ if input == self._missing: return self.context.missing_value try: year, month, day, hour, minute, second, dummy_tz = parse(input) second, micro = divmod(second, 1.0) micro = round(micro * 1000000) dt = datetime.datetime(year, month, day, hour, minute, int(second), int(micro)) except (DateTimeError, ValueError, IndexError) as v: raise ConversionError("Invalid date value", v) tz = pytz.timezone(self.timeZoneName) return tz.localize(dt)
def testParse(self): self.assertEqual(parse('1999 12 31')[:6], (1999, 12, 31, 0, 0, 0)) self.assertEqual(parse('1999 12 31 EST'), (1999, 12, 31, 0, 0, 0, 'EST')) self.assertEqual(parse('Dec 31, 1999')[:6], (1999, 12, 31, 0, 0, 0)) self.assertEqual(parse('Dec 31 1999')[:6], (1999, 12, 31, 0, 0, 0)) self.assertEqual(parse('Dec 31 1999')[:6], (1999, 12, 31, 0, 0, 0)) self.assertEqual(parse('1999/12/31 1:2:3')[:6], (1999, 12, 31, 1, 2, 3)) self.assertEqual(parse('1999-12-31 1:2:3')[:6], (1999, 12, 31, 1, 2, 3)) self.assertEqual(parse('1999-12-31T01:02:03')[:6], (1999, 12, 31, 1, 2, 3)) self.assertEqual(parse('1999-31-12 1:2:3')[:6], (1999, 12, 31, 1, 2, 3)) self.assertEqual(parse('1999-31-12 1:2:3.456')[:5], (1999, 12, 31, 1, 2)) self.assertEqual(int(parse('1999-31-12 1:2:3.456')[5]*1000+.000001), 3456) self.assertEqual(parse('1999-12-31T01:02:03.456')[:5], (1999, 12, 31, 1, 2)) self.assertEqual(int(parse('1999-12-31T01:02:03.456')[5]*1000+.000001), 3456) self.assertEqual(parse('Tue, 24 Jul 2001 09:41:03 -0400'), (2001, 7, 24, 9, 41, 3, '-0400')) self.assertEqual(parse('1999-12-31T01:02:03.456-12')[6], '-1200') self.assertEqual(parse('1999-12-31T01:02:03.456+0030')[6], '+0030') self.assertEqual(parse('1999-12-31T01:02:03.456-00:30')[6], '-0030')
def _callFUT(self, text): from zope.datetime import parse return parse(text)
def testParse(self): self.assertEqual(parse('1999 12 31')[:6], (1999, 12, 31, 0, 0, 0)) self.assertEqual(parse('1999 12 31 EST'), (1999, 12, 31, 0, 0, 0, 'EST')) self.assertEqual(parse('Dec 31, 1999')[:6], (1999, 12, 31, 0, 0, 0)) self.assertEqual(parse('Dec 31 1999')[:6], (1999, 12, 31, 0, 0, 0)) self.assertEqual(parse('Dec 31 1999')[:6], (1999, 12, 31, 0, 0, 0)) self.assertEqual( parse('1999/12/31 1:2:3')[:6], (1999, 12, 31, 1, 2, 3)) self.assertEqual( parse('1999-12-31 1:2:3')[:6], (1999, 12, 31, 1, 2, 3)) self.assertEqual( parse('1999-12-31T01:02:03')[:6], (1999, 12, 31, 1, 2, 3)) self.assertEqual( parse('1999-31-12 1:2:3')[:6], (1999, 12, 31, 1, 2, 3)) self.assertEqual( parse('1999-31-12 1:2:3.456')[:5], (1999, 12, 31, 1, 2)) self.assertEqual( int(parse('1999-31-12 1:2:3.456')[5] * 1000 + .000001), 3456) self.assertEqual( parse('1999-12-31T01:02:03.456')[:5], (1999, 12, 31, 1, 2)) self.assertEqual( int(parse('1999-12-31T01:02:03.456')[5] * 1000 + .000001), 3456) self.assertEqual(parse('Tue, 24 Jul 2001 09:41:03 -0400'), (2001, 7, 24, 9, 41, 3, '-0400')) self.assertEqual(parse('1999-12-31T01:02:03.456-12')[6], '-1200') self.assertEqual(parse('1999-12-31T01:02:03.456+0030')[6], '+0030') self.assertEqual(parse('1999-12-31T01:02:03.456-00:30')[6], '-0030')
def parse(self, value): try: return datetime(*parse(value, local=False)[:6], tzinfo=UTC) except (TypeError, SyntaxError): raise ValueError()