def parse_datetime( date_string: str, from_dt: Optional[datetime.datetime] = None ) -> Optional[datetime.datetime]: """ Parses a string into a datetime.datetime object, using |from_dt| as a base for any relative dates. """ if date_string == '' or date_string.isspace(): return None if is_str_field_none(date_string): return None settings: Dict[str, Any] = {'PREFER_DAY_OF_MONTH': 'first'} if from_dt: settings['RELATIVE_BASE'] = from_dt date_string = munge_date_string(date_string) # Only special-case strings that start with a - (to avoid parsing regular # timestamps like '2016-05-14') and that include non punctuation (to avoid # ingested values like '--') if date_string.startswith('-') and _has_non_punctuation(date_string): parsed = parse_datetime_with_negative_component(date_string, settings) else: parsed = dateparser.parse(date_string, languages=['en'], settings=settings) if parsed: return parsed raise ValueError("cannot parse date: %s" % date_string)
def parse_datetime( date_string: str, from_dt: Optional[datetime.datetime] = None ) -> Optional[datetime.datetime]: """ Parses a string into a datetime.datetime object, using |from_dt| as a base for any relative dates. """ if (date_string == "" or date_string.isspace() or _is_str_field_zeros(date_string) or is_str_field_none(date_string)): return None if is_yyyymmdd_date(date_string): as_date = parse_yyyymmdd_date(date_string) if not as_date: raise ValueError( f"Parsed date for string [{date_string}] is unexpectedly None." ) return datetime.datetime(year=as_date.year, month=as_date.month, day=as_date.day) settings: Dict[str, Any] = {"PREFER_DAY_OF_MONTH": "first"} if from_dt: settings["RELATIVE_BASE"] = from_dt date_string = munge_date_string(date_string) # Only special-case strings that start with a - (to avoid parsing regular # timestamps like '2016-05-14') and that include non punctuation (to avoid # ingested values like '--') if date_string.startswith("-") and _has_non_punctuation(date_string): parsed = parse_datetime_with_negative_component(date_string, settings) else: parsed = dateparser.parse(date_string, languages=["en"], settings=settings) if parsed: return parsed raise ValueError("cannot parse date: %s" % date_string)
def test_mungeDateString_ZeroAm(): assert munge_date_string('Jan 1, 2018 00:00 AM') == \ 'Jan 1, 2018 12:00 AM'
def test_mungeDateString_noDay(): assert munge_date_string('4y 3m') == '4year 3month'
def test_mungeDateString_noMonth(): assert munge_date_string('9Y 28D') == '9year 28day'
def test_mungeDateString_noYear(): assert munge_date_string('10M 12D') == '10month 12day'
def test_mungeDateString_caseInsensitive(): assert munge_date_string('1Y 1M 1D') == '1year 1month 1day'
def test_mungeDateString_doesntMunge(): assert munge_date_string('1year 1month 1day') == '1year 1month 1day'
def test_mungeDateString_munges(): assert munge_date_string('1y 1m 1d') == '1year 1month 1day'
def test_mungeDateString_ZeroAm() -> None: assert munge_date_string("Jan 1, 2018 00:00 AM") == "Jan 1, 2018 12:00 AM"
def test_mungeDateString_noDay() -> None: assert munge_date_string("4y 3m") == "4year 3month"
def test_mungeDateString_noMonth() -> None: assert munge_date_string("9Y 28D") == "9year 28day"
def test_mungeDateString_noYear() -> None: assert munge_date_string("10M 12D") == "10month 12day"
def test_mungeDateString_caseInsensitive() -> None: assert munge_date_string("1Y 1M 1D") == "1year 1month 1day"
def test_mungeDateString_doesntMunge() -> None: assert munge_date_string("1year 1month 1day") == "1year 1month 1day"
def test_mungeDateString_munges() -> None: assert munge_date_string("1y 1m 1d") == "1year 1month 1day"