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)
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
def test_mungeDateString_ZeroAm():
    assert munge_date_string('Jan 1, 2018 00:00 AM') == \
        'Jan 1, 2018 12:00 AM'
Exemplo n.º 4
0
def test_mungeDateString_noDay():
    assert munge_date_string('4y 3m') == '4year 3month'
Exemplo n.º 5
0
def test_mungeDateString_noMonth():
    assert munge_date_string('9Y 28D') == '9year 28day'
Exemplo n.º 6
0
def test_mungeDateString_noYear():
    assert munge_date_string('10M 12D') == '10month 12day'
Exemplo n.º 7
0
def test_mungeDateString_caseInsensitive():
    assert munge_date_string('1Y 1M 1D') == '1year 1month 1day'
Exemplo n.º 8
0
def test_mungeDateString_doesntMunge():
    assert munge_date_string('1year 1month 1day') == '1year 1month 1day'
Exemplo n.º 9
0
def test_mungeDateString_munges():
    assert munge_date_string('1y 1m 1d') == '1year 1month 1day'
Exemplo n.º 10
0
def test_mungeDateString_ZeroAm() -> None:
    assert munge_date_string("Jan 1, 2018 00:00 AM") == "Jan 1, 2018 12:00 AM"
Exemplo n.º 11
0
def test_mungeDateString_noDay() -> None:
    assert munge_date_string("4y 3m") == "4year 3month"
Exemplo n.º 12
0
def test_mungeDateString_noMonth() -> None:
    assert munge_date_string("9Y 28D") == "9year 28day"
Exemplo n.º 13
0
def test_mungeDateString_noYear() -> None:
    assert munge_date_string("10M 12D") == "10month 12day"
Exemplo n.º 14
0
def test_mungeDateString_caseInsensitive() -> None:
    assert munge_date_string("1Y 1M 1D") == "1year 1month 1day"
Exemplo n.º 15
0
def test_mungeDateString_doesntMunge() -> None:
    assert munge_date_string("1year 1month 1day") == "1year 1month 1day"
Exemplo n.º 16
0
def test_mungeDateString_munges() -> None:
    assert munge_date_string("1y 1m 1d") == "1year 1month 1day"