Skip to content

TimeHelpers

psengine.helpers.helpers.TimeHelpers

Helpers for time related functions.

is_rel_time_valid staticmethod

is_rel_time_valid(rel_time: str) -> bool

Helper function to determine if relative time expression is valid.

PARAMETER DESCRIPTION
rel_time

Relative time expression to validate.

TYPE: str

RETURNS DESCRIPTION
bool

True if valid, False otherwise.

Source code in psengine/helpers/helpers.py
@staticmethod
def is_rel_time_valid(
    rel_time: Annotated[str, Doc('Relative time expression to validate.')],
) -> Annotated[bool, Doc('True if valid, False otherwise.')]:
    """Helper function to determine if relative time expression is valid."""
    if rel_time is None or not isinstance(rel_time, str):
        return False

    return bool(re.match(VALID_TIME_REGEX, rel_time))

is_valid_time_range staticmethod

is_valid_time_range(range_: str) -> bool

Verifies if an ISO 8601 compliant time range was specified.

PARAMETER DESCRIPTION
range_

ISO 8601-style time range to validate.

TYPE: str

Example
1
2
3
4
5
    [2017-07-30,2017-07-31]
    (2017-07-30,2017-07-31)
    [2017-07-30,2017-07-31)
    [2017-07-30,)
    [,2017-07-31)

For format reference see: https://www.elastic.co/guide/en/elasticsearch/reference/current/date.html

RETURNS DESCRIPTION
bool

True if valid, False otherwise.

Source code in psengine/helpers/helpers.py
@staticmethod
def is_valid_time_range(
    range_: Annotated[str, Doc('ISO 8601-style time range to validate.')],
) -> Annotated[bool, Doc('True if valid, False otherwise.')]:
    """Verifies if an ISO 8601 compliant time range was specified.

    Example:
        ```python
            [2017-07-30,2017-07-31]
            (2017-07-30,2017-07-31)
            [2017-07-30,2017-07-31)
            [2017-07-30,)
            [,2017-07-31)
        ```
    For format reference see:
        https://www.elastic.co/guide/en/elasticsearch/reference/current/date.html
    """
    if range_ is None:
        return False

    match = re.match(r'^(\[|\()(.*)?,\s*(.*)?(\]|\))$', range_)
    if match is None:
        return False

    start_time, end_time = match.groups()[1], match.groups()[2]
    try:
        if start_time != '' and not TimeHelpers.is_rel_time_valid(start_time):
            date_parse(start_time)
        if end_time != '' and not TimeHelpers.is_rel_time_valid(end_time):
            date_parse(end_time)
    except ValueError:
        return False
    return True

rel_time_to_date staticmethod

rel_time_to_date(relative_time: str) -> str

Convert a relative time to a date.

PARAMETER DESCRIPTION
relative_time

Relative time string like '7d', '3h'. Minutes not supported.

TYPE: str

Example
rel_time_to_date("1h")  # returns ISO datetime string ~1 hour ago
rel_time_to_date("1d")  # returns ISO datetime string ~1 day ago
RAISES DESCRIPTION
ValueError

If the relative time is invalid.

RETURNS DESCRIPTION
str

Formatted date string in ISO format, e.g., '2022-08-08T13:11'.

Source code in psengine/helpers/helpers.py
@staticmethod
def rel_time_to_date(
    relative_time: Annotated[
        str, Doc("Relative time string like '7d', '3h'. Minutes not supported.")
    ],
) -> Annotated[str, Doc("Formatted date string in ISO format, e.g., '2022-08-08T13:11'.")]:
    """Convert a relative time to a date.

    Example:
        ```python
        rel_time_to_date("1h")  # returns ISO datetime string ~1 hour ago
        rel_time_to_date("1d")  # returns ISO datetime string ~1 day ago
        ```

    Raises:
        ValueError: If the relative time is invalid.
    """
    logger = logging.getLogger(__name__)
    match = re.match(VALID_TIME_REGEX, relative_time)
    if match is None:
        raise ValueError(
            f"Invalid relative time '{relative_time}'. Accepted format: [-|][integer][h|d]",
        )
    relative_time = match.groups()[-1]
    time_now = datetime.utcnow()
    digit = int(re.findall(r'^\d+', relative_time)[0])
    if relative_time.endswith('d'):
        subtracted = (time_now - timedelta(days=digit)).strftime('%Y-%m-%dT%H:%M')
    else:
        subtracted = (time_now - timedelta(hours=digit)).strftime('%Y-%m-%dT%H:%M')
    logger.debug(f'UTC Time now: {time_now}')
    logger.debug(f'Relative time -{relative_time} to date: {subtracted}')

    return subtracted