def test_parserinfo(self): self.assertEqual(parse("1/2/2014"), datetime(2014, 1, 2)) self.assertEqual(parse(b"1/2/2014"), datetime(2014, 1, 2)) self.assertEqual(parse("1/2/2014", dayfirst=True), datetime(2014, 2, 1)) self.assertEqual(parse("1/2/2014", parserinfo(dayfirst=True)), datetime(2014, 2, 1))
def testNoYearFirstNoDayFirst(self): dtstr = '090107' # Should be MMDDYY self.assertEqual(parse(dtstr), datetime(2007, 9, 1)) self.assertEqual(parse(dtstr, yearfirst=False, dayfirst=False), datetime(2007, 9, 1))
def test_datetime(self): self.assertEqual(datetime("2015-03-25 12:34"), dt.datetime(2015, 3, 25, 12, 34)) self.assertEqual(datetime(2015, 3, 99, 23, 45), datetime(2015, 3, 31, 23, 45)) self.assertEqual(datetime.now().date(), dt.datetime.now().date()) self.assertEqual(datetime.now(bdays=-45).date(), (dt.datetime.now() - relativedelta(bdays=45)).date())
def testYearFirst(self): dtstr = '090107' # Should be MMDDYY self.assertEqual(parse(dtstr, yearfirst=True), datetime(2009, 1, 7)) self.assertEqual(parse(dtstr, yearfirst=True, dayfirst=False), datetime(2009, 1, 7))
def testDayFirst(self): dtstr = '090107' # Should be DDMMYY self.assertEqual(parse(dtstr, dayfirst=True), datetime(2007, 1, 9)) self.assertEqual(parse(dtstr, yearfirst=False, dayfirst=True), datetime(2007, 1, 9))
def test_datetime(self): self.assertEqual(datetime("2015-03-25 12:34"), dt.datetime(2015, 3, 25, 12, 34)) self.assertEqual(datetime(2015, 3, 99, 23, 45), datetime(2015, 3, 31, 23, 45)) self.assertEqual(datetime.now().date(), dt.datetime.now().date()) self.assertEqual( datetime.now(bdays=-45).date(), (dt.datetime.now() - relativedelta(bdays=45)).date())
def test_bdays_zero(self): self.assertEqual("2014-11-15" + relativedelta(bdays=0), datetime(2014, 11, 17)) self.assertEqual("2014-11-17" + relativedelta(bdays=0), datetime(2014, 11, 17)) self.assertEqual("2014-11-15" - relativedelta(bdays=0), datetime(2014, 11, 14)) self.assertEqual("2014-11-14" - relativedelta(bdays=0), datetime(2014, 11, 14))
def test_datetime(self): self.assertEqual(datetime("2015-03-25 12:34"), dt.datetime(2015, 3, 25, 12, 34)) self.assertEqual(datetime(2015, 3, 15, 23, 45).month_end(), datetime(2015, 3, 31, 23, 59, 59, 999999)) self.assertEqual(datetime.now().date(), dt.datetime.now().date()) self.assertEqual(datetime.now(bdays=-45).date(), (dt.datetime.now() - relativedelta(bdays=45)).date()) self.assertEqual(datetime(time("3:40")), dt.datetime.combine(dt.datetime.today(), dt.time(3, 40, 0)))
def test_radd_time(self): self.assertEqual("2015-01-02 16:45" + relativedelta(bminutes=+30), datetime(2015, 1, 5, 9, 15)) self.assertEqual(date(2015, 1, 2) + relativedelta(bminutes=+30), datetime(2015, 1, 2, 9, 30)) self.assertEqual(date(2014, 1, 3) + relativedelta(bdays=1, bhours=4), datetime(2014, 1, 6, 13, 0)) relativedelta.btstart = time(7, 30) self.assertEqual("2015-01-02 16:45" + relativedelta(bminutes=+30), datetime(2015, 1, 5, 7, 45)) self.assertEqual("2015-01-02 16:45" + relativedelta(bhours=+0.5), datetime(2015, 1, 5, 7, 45)) del relativedelta.btstart
def test_add(self): rd1 = relativedelta(years=+1, months=+2, bdays=+3, days=+4, bhours=+5, bminutes=+6, bseconds=+7, hours=+8, minutes=+9, seconds=+10) rd2 = relativedelta(years=+10, months=-9, bdays=+8, days=-7, bhours=+6, bminutes=-5, bseconds=+4, hours=-3, minutes=+2, seconds=-1) rd3 = relativedelta(years=+11, months=-7, bdays=+11, days=-3, bhours=+11, bminutes=+1, bseconds=+11, hours=+5, minutes=+11, seconds=+9) self.assertEqual(rd1 + rd2, rd3) self.assertEqual( relativedelta(bdays=3) + date(2014, 1, 3), date(2014, 1, 8)) rd4 = relativedelta(years=+1, months=+2, days=+1) rd5 = relativedelta(years=+12, months=-5, bdays=+11, days=-2, bhours=+11, bminutes=+1, bseconds=+11, hours=+5, minutes=+11, seconds=+9) self.assertEqual(rd3 + rd4, rd5) self.assertEqual( date("2014-01-01") + relativedelta(weekday=FR), date(2014, 1, 3)) self.assertEqual( datetime("2014-11-15 1:23") + relativedelta(bdays=1), datetime(2014, 11, 18, 1, 23))
def testFuzzyAMPMProblem(self): # Sometimes fuzzy parsing results in AM/PM flag being set without # hours - if it's fuzzy it should ignore that. s1 = "I have a meeting on March 1, 1974." s2 = "On June 8th, 2020, I am going to be the first man on Mars" # Also don't want any erroneous AM or PMs changing the parsed time s3 = "Meet me at the AM/PM on Sunset at 3:00 AM on December 3rd, 2003" s4 = "Meet me at 3:00AM on December 3rd, 2003 at the AM/PM on Sunset" self.assertEqual(parse(s1, fuzzy=True), datetime(1974, 3, 1)) self.assertEqual(parse(s2, fuzzy=True), datetime(2020, 6, 8)) self.assertEqual(parse(s3, fuzzy=True), datetime(2003, 12, 3, 3)) self.assertEqual(parse(s4, fuzzy=True), datetime(2003, 12, 3, 3))
def test_radd_time(self): self.assertEqual("2015-01-02 16:45" + relativedelta(bminutes=+30), datetime(2015, 1, 5, 9, 15)) self.assertEqual( date(2015, 1, 2) + relativedelta(bminutes=+30), datetime(2015, 1, 2, 9, 30)) self.assertEqual( date(2014, 1, 3) + relativedelta(bdays=1, bhours=4), datetime(2014, 1, 6, 13, 0)) relativedelta.btstart = time(7, 30) self.assertEqual("2015-01-02 16:45" + relativedelta(bminutes=+30), datetime(2015, 1, 5, 7, 45)) self.assertEqual("2015-01-02 16:45" + relativedelta(bhours=+0.5), datetime(2015, 1, 5, 7, 45)) del relativedelta.btstart
def enfold(dt, fold=1): """ Provides a unified interface for assigning the ``fold`` attribute to datetimes both before and after the implementation of PEP-495. :param fold: The value for the ``fold`` attribute in the returned datetime. This should be either 0 or 1. :return: Returns an object for which ``getattr(dt, 'fold', 0)`` returns ``fold`` for all versions of Python. In versions prior to Python 3.6, this is a ``_DatetimeWithFold`` object, which is a subclass of :py:class:`datetime.datetime` with the ``fold`` attribute added, if ``fold`` is 1. ..versionadded:: 2.6.0 """ if getattr(dt, 'fold', 0) == fold: return dt args = dt.timetuple()[:6] args += (dt.microsecond, dt.tzinfo) if fold: return _DatetimeWithFold(*args) else: return datetime(*args)
def test_isbday(self): self.assertFalse(isbday(date(2014, 1, 4))) self.assertFalse(isbday("2014-01-04")) self.assertTrue(isbday(date(2014, 1, 1))) self.assertTrue(isbday("2014-01-01")) self.assertFalse(isbday(date(2014, 1, 1), holidays=holidays.US())) self.assertTrue(isbday(datetime(2014, 1, 1, 16, 30))) self.assertTrue(isbday(datetime(2014, 1, 1, 17, 30))) self.assertFalse( isbday(datetime(2014, 1, 1, 16, 30), holidays=holidays.US())) self.assertFalse( isbday(datetime(2014, 1, 1, 17, 30), holidays=holidays.US())) isbday.holidays = holidays.US() self.assertFalse(isbday(date(2014, 1, 1))) self.assertFalse(isbday(date(2014, 7, 4))) self.assertTrue(isbday(date(2014, 7, 4), holidays=holidays.CA()))
def testFuzzyWithTokens(self): s = "Today is 25 of September of 2003, exactly " \ "at 10:49:41 with timezone -03:00." self.assertEqual( parse(s, fuzzy_with_tokens=True), (datetime(2003, 9, 25, 10, 49, 41, tzinfo=self.brsttz), ('Today is ', 'of ', ', exactly at ', ' with timezone ', '.')))
def testParseWithNulls(self): # This relies on the from __future__ import unicode_literals, because # explicitly specifying a unicode literal is a syntax error in Py 3.2 # May want to switch to u'...' if we ever drop Python 3.2 support. pstring = '\x00\x00August 29, 1924' self.assertEqual(parse(pstring), datetime(1924, 8, 29))
def test_isbday(self): self.assertFalse(isbday(date(2014, 1, 4))) self.assertFalse(isbday("2014-01-04")) self.assertTrue(isbday(date(2014, 1, 1))) self.assertTrue(isbday("2014-01-01")) self.assertFalse(isbday(date(2014, 1, 1), holidays=holidays.US())) self.assertTrue(isbday(datetime(2014, 1, 1, 16, 30))) self.assertTrue(isbday(datetime(2014, 1, 1, 17, 30))) self.assertFalse(isbday(datetime(2014, 1, 1, 16, 30), holidays=holidays.US())) self.assertFalse(isbday(datetime(2014, 1, 1, 17, 30), holidays=holidays.US())) isbday.holidays = holidays.US() self.assertFalse(isbday(date(2014, 1, 1))) self.assertFalse(isbday(date(2014, 7, 4))) self.assertTrue(isbday(date(2014, 7, 4), holidays=holidays.CA()))
def testFuzzyWithTokens(self): s = "Today is 25 of September of 2003, exactly " \ "at 10:49:41 with timezone -03:00." self.assertEqual(parse(s, fuzzy_with_tokens=True), (datetime(2003, 9, 25, 10, 49, 41, tzinfo=self.brsttz), ('Today is ', 'of ', ', exactly at ', ' with timezone ', '.')))
def test_radd(self): self.assertEqual(date(2014, 1, 3) + relativedelta(bdays=2), date(2014, 1, 7)) self.assertEqual(date(2014, 1, 7) + relativedelta(bdays=-2), date(2014, 1, 3)) self.assertEqual(date(2014, 2, 3) + relativedelta(bdays=-19), date(2014, 1, 7)) self.assertEqual(date(2014, 1, 3) + relativedelta(bdays=1.5), datetime(2014, 1, 6, 13, 0))
def testMicrosecondPrecisionErrorReturns(self): # One more precision issue, discovered by Eric Brown. This should # be the last one, as we're no longer using floating points. for ms in [100001, 100000, 99999, 99998, 10001, 10000, 9999, 9998, 1001, 1000, 999, 998, 101, 100, 99, 98]: dt = datetime(2008, 2, 27, 21, 26, 1, ms) self.assertEqual(parse(dt.isoformat()), dt)
def testMicrosecondPrecisionErrorReturns(self): # One more precision issue, discovered by Eric Brown. This should # be the last one, as we're no longer using floating points. for ms in [ 100001, 100000, 99999, 99998, 10001, 10000, 9999, 9998, 1001, 1000, 999, 998, 101, 100, 99, 98 ]: dt = datetime(2008, 2, 27, 21, 26, 1, ms) self.assertEqual(parse(dt.isoformat()), dt)
def testIncreasingCTime(self): # This test will check 200 different years, every month, every day, # every hour, every minute, every second, and every weekday, using # a delta of more or less 1 year, 1 month, 1 day, 1 minute and # 1 second. delta = timedelta(days=365 + 31 + 1, seconds=1 + 60 + 60 * 60) dt = datetime(1900, 1, 1, 0, 0, 0, 0) for i in range(200): self.assertEqual(parse(dt.ctime()), dt) dt += delta
def test_init(self): self.assertEqual(relativedelta(date(2014, 1, 7), date(2014, 1, 3)), relativedelta(days=4, bdays=2)) self.assertEqual(relativedelta(date(2014, 1, 31), date(2014, 1, 1)), relativedelta(days=30, bdays=22)) self.assertEqual(relativedelta(date(2014, 2, 1), date(2014, 1, 1)), relativedelta(months=1, bdays=22)) self.assertEqual(relativedelta(date(2014, 2, 2), date(2014, 1, 1)), relativedelta(months=1, days=1, bdays=22)) self.assertEqual(relativedelta(date(2014, 1, 1), date(2014, 2, 2)), relativedelta(months=-1, days=-1, bdays=-22)) self.assertEqual(relativedelta(datetime(2017, 1, 16), datetime(2017, 1, 16), holidays=holidays.US()), relativedelta(bdays=0)) self.assertEqual(relativedelta(datetime(2017, 1, 17), datetime(2017, 1, 16), holidays=holidays.US()), relativedelta(days=1, bdays=0))
def test_isbday(self): self.assertFalse(isbday(date(2014, 1, 4))) self.assertFalse(isbday("2014-01-04")) self.assertTrue(isbday(date(2014, 1, 1))) self.assertTrue(isbday("2014-01-01")) self.assertFalse(isbday(date(2014, 1, 1), holidays=holidays.US())) self.assertTrue(isbday(datetime(2014, 1, 1, 16, 30))) self.assertTrue(isbday(datetime(2014, 1, 1, 17, 30))) self.assertFalse(isbday(datetime(2014, 1, 1, 16, 30), holidays=holidays.US())) self.assertFalse(isbday(datetime(2014, 1, 1, 17, 30), holidays=holidays.US())) bdateutil.HOLIDAYS = holidays.Canada() self.assertFalse(isbday(date(2014, 7, 1))) self.assertTrue(isbday(date(2014, 7, 4))) self.assertFalse(isbday(date(2014, 1, 1))) self.assertTrue(isbday(date(2014, 7, 1), holidays=holidays.US())) self.assertFalse(isbday(date(2014, 7, 4), holidays=holidays.US())) bdateutil.HOLIDAYS = []
def testIncreasingCTime(self): # This test will check 200 different years, every month, every day, # every hour, every minute, every second, and every weekday, using # a delta of more or less 1 year, 1 month, 1 day, 1 minute and # 1 second. delta = timedelta(days=365+31+1, seconds=1+60+60*60) dt = datetime(1900, 1, 1, 0, 0, 0, 0) for i in range(200): self.assertEqual(parse(dt.ctime()), dt) dt += delta
def testCustomParserInfo(self): # Custom parser info wasn't working, as Michael Elsdörfer discovered. from bdateutil.parser import parserinfo, parser class myparserinfo(parserinfo): MONTHS = parserinfo.MONTHS[:] MONTHS[0] = ("Foo", "Foo") myparser = parser(myparserinfo()) dt = myparser.parse("01/Foo/2007") self.assertEqual(dt, datetime(2007, 1, 1))
def test_rsub(self): self.assertEqual( date(2014, 1, 7) - relativedelta(bdays=2), date(2014, 1, 3)) self.assertEqual( date(2014, 1, 3) - relativedelta(bdays=-2), date(2014, 1, 7)) self.assertEqual( date(2014, 2, 3) - relativedelta(bdays=19), date(2014, 1, 7)) self.assertEqual("2014-11-15" - relativedelta(bdays=1), datetime(2014, 11, 14)) self.assertEqual(date.today() - relativedelta(bdays=+45), date.today() + relativedelta(bdays=-45))
def test_rsub(self): self.assertEqual(date(2014, 1, 7) - relativedelta(bdays=2), date(2014, 1, 3)) self.assertEqual(date(2014, 1, 3) - relativedelta(bdays=-2), date(2014, 1, 7)) self.assertEqual(date(2014, 2, 3) - relativedelta(bdays=19), date(2014, 1, 7)) self.assertEqual("2014-11-15" - relativedelta(bdays=1), datetime(2014, 11, 14)) self.assertEqual(date.today() - relativedelta(bdays=+45), date.today() + relativedelta(bdays=-45))
def testParseUnicodeWords(self): class rus_parserinfo(parserinfo): MONTHS = [("янв", "Январь"), ("фев", "Февраль"), ("мар", "Март"), ("апр", "Апрель"), ("май", "Май"), ("июн", "Июнь"), ("июл", "Июль"), ("авг", "Август"), ("сен", "Сентябрь"), ("окт", "Октябрь"), ("ноя", "Ноябрь"), ("дек", "Декабрь")] self.assertEqual( parse('10 Сентябрь 2015 10:20', parserinfo=rus_parserinfo()), datetime(2015, 9, 10, 10, 20))
def test_parse(self): self.assertEqual(list(rrule(BDAILY, count=4, dtstart="2014-01-01")), [datetime(2014, 1, 1, 0, 0), datetime(2014, 1, 2, 0, 0), datetime(2014, 1, 3, 0, 0), datetime(2014, 1, 6, 0, 0)]) self.assertEqual(list(rrule(BDAILY, count=4, dtstart="2014-01-01", until="01/04/2014")), [datetime(2014, 1, 1, 0, 0), datetime(2014, 1, 2, 0, 0), datetime(2014, 1, 3, 0, 0)])
def test_add(self): rd1 = relativedelta(years=+1, months=+2, bdays=+3, days=+4, bhours=+5, bminutes=+6, bseconds=+7, hours=+8, minutes=+9, seconds=+10) rd2 = relativedelta(years=+10, months=-9, bdays=+8, days=-7, bhours=+6, bminutes=-5, bseconds=+4, hours=-3, minutes=+2, seconds=-1) rd3 = relativedelta(years=+11, months=-7, bdays=+11, days=-3, bhours=+11, bminutes=+1, bseconds=+11, hours=+5, minutes=+11, seconds=+9) self.assertEqual(rd1 + rd2, rd3) self.assertEqual(relativedelta(bdays=3) + date(2014, 1, 3), date(2014, 1, 8)) rd4 = relativedelta(years=+1, months=+2, days=+1) rd5 = relativedelta(years=+12, months=-5, bdays=+11, days=-2, bhours=+11, bminutes=+1, bseconds=+11, hours=+5, minutes=+11, seconds=+9) self.assertEqual(rd3 + rd4, rd5) self.assertEqual(date("2014-01-01") + relativedelta(weekday=FR), date(2014, 1, 3)) self.assertEqual(datetime("2014-11-15 1:23") + relativedelta(bdays=1), datetime(2014, 11, 18, 1, 23))
def test_radd_time(self): self.assertEqual(datetime("2015-01-02 16:45") + relativedelta(bminutes=+30), datetime(2015, 1, 5, 9, 15)) self.assertEqual(date(2015, 1, 2) + relativedelta(bminutes=+30), datetime(2015, 1, 2, 9, 30)) self.assertEqual(date(2014, 1, 3) + relativedelta(bdays=1, bhours=4), datetime(2014, 1, 6, 13, 0)) bdateutil.BTSTART = time(7, 30) self.assertEqual(datetime("2015-01-02 16:45") + relativedelta(bminutes=+30), datetime(2015, 1, 5, 7, 45)) self.assertEqual(datetime("2015-01-02 16:45") + relativedelta(bhours=+0.5), datetime(2015, 1, 5, 7, 45)) bdateutil.BTSTART = time(9, 0)
def setUp(self): self.tzinfos = {"BRST": -10800} self.brsttz = tzoffset("BRST", -10800) self.default = datetime(2003, 9, 25) # Parser should be able to handle bytestring and unicode base_str = '2014-05-01 08:00:00' try: # Python 2.x self.uni_str = unicode(base_str) self.str_str = str(base_str) except NameError: self.uni_str = str(base_str) self.str_str = bytes(base_str.encode())
def testDuckTyping(self): # We want to support arbitrary classes that implement the stream # interface. class StringPassThrough(object): def __init__(self, stream): self.stream = stream def read(self, *args, **kwargs): return self.stream.read(*args, **kwargs) dstr = StringPassThrough(StringIO('2014 January 19')) self.assertEqual(parse(dstr), datetime(2014, 1, 19))
def test_start_end(self): dt = datetime(2016, 12, 30, 5) self.assertEqual(dt.day_start(), datetime(2016, 12, 30, 0)) self.assertEqual(dt.day_end(), datetime(2016, 12, 30, 23, 59, 59, 999999)) self.assertEqual(dt.month_start(), datetime(2016, 12, 1, 0)) self.assertEqual(dt.month_end(), datetime(2016, 12, 31, 23, 59, 59, 999999)) self.assertEqual(dt.year_start(), datetime(2016, 1, 1, 0)) self.assertEqual(dt.year_end(), datetime(2016, 12, 31, 23, 59, 59, 999999)) d = date(2015, 2, 13) self.assertEqual(d.month_start(), date(2015, 2, 1)) self.assertEqual(d.month_end(), date(2015, 2, 28)) self.assertEqual(d.year_start(), date(2015, 1, 1)) self.assertEqual(d.year_end(), date(2015, 12, 31))
def test_add_sub(self): self.assertEqual(datetime("2014-11-15 1:23").add(bdays=1), datetime(2014, 11, 18, 1, 23)) self.assertEqual(datetime("2014-11-15 1:23").sub(bdays=-1), datetime(2014, 11, 18, 1, 23)) self.assertEqual(date(2016, 1, 1).add(hours=2, minutes=4), datetime(2016, 1, 1, 2, 4)) self.assertEqual(datetime(2016, 1, 1, 0).sub(days=1), datetime(2015, 12, 31, 0)) ush = holidays.US() self.assertEqual(date(2016, 12, 30).add(bdays=1, holidays=ush), date(2017, 1, 3)) self.assertEqual(date(2016, 12, 31).add(bdays=0, holidays=ush), date(2017, 1, 3)) self.assertEqual(date(2016, 12, 31).add(bdays=1, holidays=ush), date(2017, 1, 4)) self.assertEqual(time(3, 40).add(hours=5, minutes=25), time(9, 5))
def testParseUnicodeWords(self): class rus_parserinfo(parserinfo): MONTHS = [("янв", "Январь"), ("фев", "Февраль"), ("мар", "Март"), ("апр", "Апрель"), ("май", "Май"), ("июн", "Июнь"), ("июл", "Июль"), ("авг", "Август"), ("сен", "Сентябрь"), ("окт", "Октябрь"), ("ноя", "Ноябрь"), ("дек", "Декабрь")] self.assertEqual(parse('10 Сентябрь 2015 10:20', parserinfo=rus_parserinfo()), datetime(2015, 9, 10, 10, 20))
def test_init_time(self): self.assertEqual(relativedelta(datetime(2015, 1, 5, 9, 15), datetime(2015, 1, 2, 16, 45)), relativedelta(days=2, hours=16, minutes=30, bminutes=30)) self.assertEqual(relativedelta(datetime(2015, 1, 20, 21, 22), datetime(2015, 1, 9, 3, 0)), relativedelta(days=11, hours=18, minutes=22, bdays=7, bhours=8, bminutes=0)) self.assertEqual(relativedelta(datetime(2015, 1, 20, 21, 22), datetime(2015, 1, 9, 3, 0), holidays=holidays.US()), relativedelta(days=11, hours=18, minutes=22, bdays=6, bhours=8, bminutes=0)) bdateutil.HOLIDAYS = holidays.CA() self.assertEqual(relativedelta(datetime(2015, 1, 20, 21, 22), datetime(2015, 1, 9, 3, 0)), relativedelta(days=11, hours=18, minutes=22, bdays=7, bhours=8, bminutes=0)) bdateutil.HOLIDAYS = [] self.assertEqual(relativedelta(time(3, 40), time(2, 37)), relativedelta(hours=1, minutes=3))
def testDateCommandFormat(self): self.assertEqual( parse("Thu Sep 25 10:36:28 BRST 2003", tzinfos=self.tzinfos), datetime(2003, 9, 25, 10, 36, 28, tzinfo=self.brsttz))
def testUnambiguousDayFirstYearFirst(self): dtstr = '2015 09 25' self.assertEqual(parse(dtstr, dayfirst=True, yearfirst=True), datetime(2015, 9, 25))
def testDayFirstYearFirst(self): dtstr = '090107' # Should be YYDDMM self.assertEqual(parse(dtstr, yearfirst=True, dayfirst=True), datetime(2009, 7, 1))