def test_apply_negative_delta(self): """Test adding months to a date.""" self.assertEqual(datetime(2012, 1, 10), date.apply_month_delta(datetime(2012, 3, 10), -2)) self.assertEqual(datetime(2012, 1, 31), date.apply_month_delta(datetime(2012, 3, 31), -2)) self.assertEqual(datetime(2012, 2, 29), date.apply_month_delta(datetime(2012, 3, 31), -1)) self.assertEqual(datetime(2012, 3, 2), date.apply_month_delta(datetime(2012, 3, 31), -1, add_overlap=True))
def test_apply_negative_delta(self): """Test adding months to a date.""" self.assertEqual(datetime(2012, 1, 10), date.apply_month_delta(datetime(2012, 3, 10), -2)) self.assertEqual(datetime(2012, 1, 31), date.apply_month_delta(datetime(2012, 3, 31), -2)) self.assertEqual(datetime(2012, 2, 29), date.apply_month_delta(datetime(2012, 3, 31), -1)) self.assertEqual(datetime(2012, 3, 2), date.apply_month_delta(datetime(2012, 3, 31), -1, add_overlap=True))
def str2time(string: str, timestamp=None) -> datetime.timedelta: """ Return a timedelta for a shorthand duration. :param string: a string defining a time period: Examples:: 300s - 300 seconds 36h - 36 hours 7d - 7 days 2w - 2 weeks (14 days) 1y - 1 year :param timestamp: a timestamp to calculate a more accurate duration offset used by years :type timestamp: datetime.datetime :return: the corresponding timedelta object """ key, duration = checkstr(string) if duration.isdigit(): duration = int(duration) else: key = '' if key in ['d', 's', 'h', 'w']: # days, seconds, hours, weeks return datetime.timedelta(**{MW_KEYS[key]: duration}) if key == 'y': # years days = math.ceil(duration * 365.25) duration *= 12 else: raise MalformedConfigError( 'Unrecognized parameter in template: {}'.format(string)) if timestamp: return apply_month_delta(timestamp.date(), month_delta=duration) - timestamp.date() return datetime.timedelta(days=days)
def str2time(string, timestamp=None): """ Return a timedelta for a shorthand duration. @param string: a string defining a time period: 300s - 300 seconds 36h - 36 hours 7d - 7 days 2w - 2 weeks (14 days) 1y - 1 year @type string: str @param timestamp: a timestamp to calulate a more accurate duration offset used by years @type timestamp: datetime.datetime @return: the corresponding timedelta object @rtype: datetime.timedelta """ key, duration = checkstr(string) if duration.isdigit(): duration = int(duration) else: key = '' if key in ['d', 's', 'h', 'w']: # days, seconds, hours, weeks return datetime.timedelta(**{MW_KEYS[key]: duration}) if key == 'y': # years days = math.ceil(duration * 365.25) duration *= 12 else: raise MalformedConfigError( 'Unrecognized parameter in template: {0}'.format(string)) if timestamp: return apply_month_delta( timestamp.date(), month_delta=duration) - timestamp.date() else: return datetime.timedelta(days=days)