From 5cbcf830026ba7c258aad4948b632d40e9b20b38 Mon Sep 17 00:00:00 2001 From: DingZQ Date: Sun, 9 Mar 2025 15:15:57 +0800 Subject: [PATCH] Update time_api --- influxdb_api.py | 5 +-- install.py | 1 + time_api.py | 86 ++++++++++++++++++++++++++----------------------- 3 files changed, 48 insertions(+), 44 deletions(-) diff --git a/influxdb_api.py b/influxdb_api.py index d152150..689ffbd 100644 --- a/influxdb_api.py +++ b/influxdb_api.py @@ -1465,11 +1465,8 @@ def query_SCADA_data_by_device_ID_and_date(query_ids_list: List[str], query_date :return: """ start_time, end_time = time_api.parse_beijing_date_range(query_date) - start_time_str = time_api.format_beijing_time(start_time) - end_time_str = time_api.format_beijing_time(end_time) - print(f"start_time_str: {start_time_str}, end_time_str: {end_time_str}") - return query_SCADA_data_by_device_ID_and_time_range(query_ids_list, start_time_str, end_time_str, bucket, client) + return query_SCADA_data_by_device_ID_and_time_range(query_ids_list, str(start_time), str(end_time), bucket, client) # 2025/02/01 diff --git a/install.py b/install.py index dbe11ef..ca7ac84 100644 --- a/install.py +++ b/install.py @@ -27,6 +27,7 @@ def install(): 'openpyxl', 'redis', 'pydantic', + 'python-dateutil', 'starlette', 'requests', 'uvicorn', diff --git a/time_api.py b/time_api.py index 19c62f3..a41a61a 100644 --- a/time_api.py +++ b/time_api.py @@ -1,4 +1,5 @@ -import datetime +from datetime import datetime, timezone, timedelta +from dateutil import parser, tz ''' 2025-02-09T15:45:00+00:00 采用的是 ISO 8601 国际标准日期时间格式,具体特点如下: @@ -12,86 +13,91 @@ import datetime 2025-02-09T15:45:00+08:00 ''' +BG_TZ = tz.gettz('Asia/Shanghai') +UTC_TZ = tz.gettz('UTC') -def parse_utc_time(query_time: str) -> datetime.datetime: +def parse_utc_time(query_time: str) -> datetime: ''' - 将一个北京时间的时间点,转换成utc + 接受 任意格式的字符串,如果解析出来不带时区,则用 replace 添加 +00:00 时区 + 如果解析出来已经有时区,则用 astimezone 转换成UTC时间 ''' - return datetime.datetime.fromisoformat(query_time) + + # 解析时间字符串 + dt: datetime = parser.parse(query_time) + if dt.tzinfo is None: + dt = dt.replace(tzinfo=UTC_TZ) + else: + dt = dt.astimezone(UTC_TZ) + + return dt -def parse_beijing_time(query_time: str) -> datetime.datetime: +def parse_beijing_time(query_time: str) -> datetime: ''' - 将一个 2025-02-09T15:45:00+00:00 的北京时间时间点 + 接受 任意格式的字符串,如果解析出来不带时区,则用 replace 添加 +08:00 时区 + 如果解析出来已经有时区,则用 astimezone 转换成北京时间 + + 也就是任意合法的时间字符串,最后都解析成 北京 时间 + ''' - try: - return datetime.datetime.strptime(query_time, "%Y-%m-%dT%H:%M%z") - except Exception as e: - print(f"Error parsing Beijing time: {e}") - return datetime.datetime.strptime(query_time, "%Y-%m-%dT%H:%M:%S%z") + # 解析时间字符串 + dt: datetime = parser.parse(query_time) + if dt.tzinfo is None: + dt = dt.replace(tzinfo=BG_TZ) + else: + dt = dt.astimezone(tz=BG_TZ) -def to_utc_time(dt: datetime.datetime) -> datetime.datetime: + return dt + + +def to_utc_time(dt: datetime) -> datetime: ''' 将一个北京时间的时间点,转换成utc ''' - utc_time = dt.astimezone(datetime.timezone.utc) + utc_time = dt.astimezone(UTC_TZ) return utc_time -def to_beijing_time(dt: datetime.datetime) -> datetime.datetime: + +def to_beijing_time(dt: datetime) -> datetime: ''' 将一个 utc 的时间点,转换成北京时间 ''' - beijing_time = dt.astimezone(datetime.timezone(datetime.timedelta(hours=8))) + beijing_time = dt.astimezone(tz=BG_TZ) return beijing_time -def parse_date(query_time: str) -> datetime.date: - ''' - 将一个日期字符串,转换成日期 - 日期字符串格式:YYYY-MM-DD - ''' - return datetime.datetime.fromisoformat(query_time).date() - -def to_time_range(dt: datetime, delta: float) -> tuple[datetime.datetime, datetime.datetime]: +def to_time_range(dt: datetime, delta: float) -> tuple[datetime, datetime]: ''' 将一个时间点,转换成 start/end 时间段 有些查询按照一个时间点查不到,用时间段保证能成功 delta 单位是秒 ''' - start_time = dt - datetime.timedelta(seconds=delta) - end_time = dt + datetime.timedelta(seconds=delta) + start_time = dt - timedelta(seconds=delta) + end_time = dt + timedelta(seconds=delta) return (start_time, end_time) -def parse_beijing_date_range(query_time: str) -> tuple[datetime.datetime, datetime.datetime]: +def parse_beijing_date_range(query_date: str) -> tuple[datetime, datetime]: ''' - 将一个日期字符串,转换成 start/end 时间段 + 将一个日期字符串,转换成 start/end 时间段,传进来的日期被认为是北京时间 日期字符串格式:YYYY-MM-DD ''' - start_time = datetime.datetime.fromisoformat(query_time) - end_time = start_time + datetime.timedelta(days=1) - - start_time = to_beijing_time(start_time) - end_time = to_beijing_time(end_time) + start_time = parse_beijing_time(query_date) + end_time = start_time + timedelta(days=1) return (start_time, end_time) -def format_beijing_time(dt: datetime.datetime) -> str: - ''' - 将一个北京时间的时间点,转换成字符串 - 格式:YYYY-MM-DDTHH:MM:SS+08:00 - ''' - return dt.strftime('%Y-%m-%dT%H:%M:%S%z') -def get_day_start(dt: datetime.date) -> datetime.datetime: +def get_day_start(dt: datetime.date) -> datetime: ''' 获取 某一天的 00:00:00 这一天可以是北京时间,也可以是 utc 时间 ''' return dt.replace(hour=0, minute=0, second=0, microsecond=0) -def get_day_end(dt: datetime.date) -> datetime.datetime: + +def get_day_end(dt: datetime.date) -> datetime: ''' 获取 某一天的 23:59:59 这一天可以是北京时间,也可以是 utc 时间