Source code for task_script_utils.convert_datetime_to_ts_format
import warnings
from typing import Union
import arrow
import dateparser
from dateutil import tz
from typing_extensions import deprecated
[docs]
@deprecated(
"Use `task_script_utils.datetime_parser.DatetimeParser instead`", category=None
)
def convert_datetime_to_ts_format(
datetime, datetime_format: str = "", timezone: Union[tz.tzoffset, str] = ""
):
"""
*Warning**: Deprecated function. Use `DatetimeParser.to_tsformat` from
`task_script_utils.datetime_parser` instead.
Convert datetime to TetraScience standard: ISO-8601 in milliseconds in UTC if
timezone is available
Inputs:
datetime - raw datetime
datetime_format - raw datetime format build using arrow tokens
link: must follow https://arrow.readthedocs.io/en/stable/#format
timezone - user-defined timezone. If the user specify an timezone, it will
overwrite the timezone extracted from the raw datetime. It can be either
string (i.e. "GMT-5") or a timezone type recognized by the arrow.get function.
Output:
Datetime string in ISO-8601 with millisecond precision. If timezone is defined,
it will be in UTC indicated by 'Z'.
Examples:
If timezone is defined: "2019-07-17T14:21:00.000Z"
If timezone is not defined: "2019-07-17T11:21:00.000"
"""
if datetime_format:
parsed_time = arrow.get(datetime, datetime_format)
parser_name = "arrow"
else:
parsed_time = dateparser.parse(datetime)
parser_name = "dateparser"
if parsed_time is None:
raise ValueError(
# pylint: disable=line-too-long
f"Could not parse input datetime string {datetime} using {parser_name} and the following input formats: {datetime_format}" # noqa: E501
)
timezone_to_use = parsed_time.tzinfo
if timezone:
try:
timezone_to_use = tz.gettz(timezone)
except TypeError:
warnings.warn(
# pylint: disable=line-too-long
"The provided timezone can't be parsed by dateutil tz, going to use the plain value" # noqa: E501
)
timezone_to_use = timezone
datetime_iso_local = ""
utc_indicator = ""
if timezone_to_use:
datetime_iso_local = arrow.get(str(parsed_time), tzinfo=timezone_to_use)
utc_indicator = "Z"
else:
datetime_iso_local = arrow.get(str(parsed_time), tzinfo=tz.gettz("GMT"))
ts_datetime = (
datetime_iso_local.to("GMT")
.format("YYYY-MM-DDTHH:mm:ss.SSSZ")
.replace("+0000", utc_indicator)
)
return ts_datetime