Update time_api
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -27,6 +27,7 @@ def install():
|
||||
'openpyxl',
|
||||
'redis',
|
||||
'pydantic',
|
||||
'python-dateutil',
|
||||
'starlette',
|
||||
'requests',
|
||||
'uvicorn',
|
||||
|
||||
100
time_api.py
100
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:
|
||||
'''
|
||||
接受 任意格式的字符串,如果解析出来不带时区,则用 replace 添加 +00:00 时区
|
||||
如果解析出来已经有时区,则用 astimezone 转换成UTC时间
|
||||
'''
|
||||
|
||||
# 解析时间字符串
|
||||
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:
|
||||
'''
|
||||
接受 任意格式的字符串,如果解析出来不带时区,则用 replace 添加 +08:00 时区
|
||||
如果解析出来已经有时区,则用 astimezone 转换成北京时间
|
||||
|
||||
也就是任意合法的时间字符串,最后都解析成 北京 时间
|
||||
|
||||
'''
|
||||
|
||||
# 解析时间字符串
|
||||
dt: datetime = parser.parse(query_time)
|
||||
if dt.tzinfo is None:
|
||||
dt = dt.replace(tzinfo=BG_TZ)
|
||||
else:
|
||||
dt = dt.astimezone(tz=BG_TZ)
|
||||
|
||||
return dt
|
||||
|
||||
|
||||
def to_utc_time(dt: datetime) -> datetime:
|
||||
'''
|
||||
将一个北京时间的时间点,转换成utc
|
||||
'''
|
||||
return datetime.datetime.fromisoformat(query_time)
|
||||
|
||||
def parse_beijing_time(query_time: str) -> datetime.datetime:
|
||||
'''
|
||||
将一个 2025-02-09T15:45:00+00:00 的北京时间时间点
|
||||
'''
|
||||
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")
|
||||
|
||||
def to_utc_time(dt: datetime.datetime) -> 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 时间
|
||||
|
||||
Reference in New Issue
Block a user