filters/date.py (55 lines of code) (raw):

# Copyright 2021 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from datetime import datetime, timezone from time import mktime import parsedatetime from recurrent.event_parser import RecurringEvent from dateutil import rrule class InvalidDatetimeException(Exception): pass class InvalidRecurringDateException(Exception): pass def strftime(timestamp_string, strftime_format): dt = datetime.now() if timestamp_string and timestamp_string != '': if isinstance(timestamp_string, int): # Unix time dt = datetime.utcfromtimestamp(timestamp_string) else: parsed = parsedatetime.Calendar( version=parsedatetime.VERSION_CONTEXT_STYLE).parse( timestamp_string) if len(parsed) > 1: dt = datetime(*parsed[0][:6]) else: dt = datetime(*parsed[:6]) return dt.strftime(strftime_format) def utc_strftime(timestamp_string, strftime_format): dt = datetime.now(timezone.utc) if timestamp_string and timestamp_string != '': if isinstance(timestamp_string, int): # Unix time dt = datetime.utcfromtimestamp(timestamp_string) else: parsed = parsedatetime.Calendar( version=parsedatetime.VERSION_CONTEXT_STYLE).parse( timestamp_string) if len(parsed) > 1: dt = datetime.fromtimestamp(mktime(parsed[0])) else: dt = datetime.fromtimestamp(mktime(parsed)) return dt.strftime(strftime_format) def recurring_date(event, now_date=None, strftime_format='%Y-%m-%d'): if now_date is not None: time_struct, parse_status = parsedatetime.Calendar( version=parsedatetime.VERSION_CONTEXT_STYLE).parse(now_date) if not parse_status: raise InvalidDatetimeException('Failed to parse "%s"' % (now_date)) now_date = datetime(*time_struct[:6]) else: now_date = datetime.today() actually_now = datetime.strptime(datetime.today().strftime(strftime_format), strftime_format) r = RecurringEvent(now_date=now_date) if not r.parse(event): raise InvalidRecurringDateException('Invalid recurring date "%s"' % (event)) rr = rrule.rrulestr(r.get_RFC_rrule()) res = rr.after(actually_now, inc=True) return res.strftime(strftime_format)