From 0dc057dad7e61b1c80cf070ca0de14420f431a18 Mon Sep 17 00:00:00 2001 From: JIANG Date: Fri, 5 Dec 2025 11:10:55 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=97=B6=E5=8C=BA=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- timescaledb/router.py | 4 ++- timescaledb/schemas/realtime.py | 46 ++++++++++++++++++++++++++++----- timescaledb/schemas/scheme.py | 44 ++++++++++++++++++++++++++----- 3 files changed, 81 insertions(+), 13 deletions(-) diff --git a/timescaledb/router.py b/timescaledb/router.py index ac2fe9c..680789d 100644 --- a/timescaledb/router.py +++ b/timescaledb/router.py @@ -281,5 +281,7 @@ async def delete_scada_data( end_time: datetime, conn: AsyncConnection = Depends(get_database_connection), ): - await ScadaRepository.delete_scada_by_id_time(conn, device_id, start_time, end_time) + await ScadaRepository.delete_scada_by_id_time_range( + conn, device_id, start_time, end_time + ) return {"message": "Deleted successfully"} diff --git a/timescaledb/schemas/realtime.py b/timescaledb/schemas/realtime.py index dc8997a..91bf09f 100644 --- a/timescaledb/schemas/realtime.py +++ b/timescaledb/schemas/realtime.py @@ -1,7 +1,10 @@ from typing import List, Any, Dict -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone from psycopg import AsyncConnection, sql +# 定义UTC+8时区 +UTC_8 = timezone(timedelta(hours=8)) + class RealtimeRepository: @@ -287,11 +290,22 @@ class RealtimeRepository: """ # Convert result_start_time string to datetime if needed if isinstance(result_start_time, str): - simulation_time = datetime.fromisoformat( - result_start_time.replace("Z", "+00:00") - ) + # 如果是ISO格式字符串,解析并转换为UTC+8 + if result_start_time.endswith("Z"): + # UTC时间,转换为UTC+8 + utc_time = datetime.fromisoformat( + result_start_time.replace("Z", "+00:00") + ) + simulation_time = utc_time.astimezone(UTC_8) + else: + # 假设已经是UTC+8时间 + simulation_time = datetime.fromisoformat(result_start_time) + if simulation_time.tzinfo is None: + simulation_time = simulation_time.replace(tzinfo=UTC_8) else: simulation_time = result_start_time + if simulation_time.tzinfo is None: + simulation_time = simulation_time.replace(tzinfo=UTC_8) # Prepare node data for batch insert node_data = [] @@ -353,9 +367,19 @@ class RealtimeRepository: """ # Convert query_time string to datetime if isinstance(query_time, str): - target_time = datetime.fromisoformat(query_time.replace("Z", "+00:00")) + if query_time.endswith("Z"): + # UTC时间,转换为UTC+8 + utc_time = datetime.fromisoformat(query_time.replace("Z", "+00:00")) + target_time = utc_time.astimezone(UTC_8) + else: + # 假设已经是UTC+8时间 + target_time = datetime.fromisoformat(query_time) + if target_time.tzinfo is None: + target_time = target_time.replace(tzinfo=UTC_8) else: target_time = query_time + if target_time.tzinfo is None: + target_time = target_time.replace(tzinfo=UTC_8) # Create time range: query_time ± 1 second start_time = target_time - timedelta(seconds=1) @@ -394,9 +418,19 @@ class RealtimeRepository: """ # Convert query_time string to datetime if isinstance(query_time, str): - target_time = datetime.fromisoformat(query_time.replace("Z", "+00:00")) + if query_time.endswith("Z"): + # UTC时间,转换为UTC+8 + utc_time = datetime.fromisoformat(query_time.replace("Z", "+00:00")) + target_time = utc_time.astimezone(UTC_8) + else: + # 假设已经是UTC+8时间 + target_time = datetime.fromisoformat(query_time) + if target_time.tzinfo is None: + target_time = target_time.replace(tzinfo=UTC_8) else: target_time = query_time + if target_time.tzinfo is None: + target_time = target_time.replace(tzinfo=UTC_8) # Create time range: query_time ± 1 second start_time = target_time - timedelta(seconds=1) diff --git a/timescaledb/schemas/scheme.py b/timescaledb/schemas/scheme.py index 7d2021d..6f8e293 100644 --- a/timescaledb/schemas/scheme.py +++ b/timescaledb/schemas/scheme.py @@ -1,7 +1,10 @@ from typing import List, Any, Dict -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone from psycopg import AsyncConnection, sql +# 定义UTC+8时区 +UTC_8 = timezone(timedelta(hours=8)) + class SchemeRepository: @@ -309,11 +312,20 @@ class SchemeRepository: """ # Convert result_start_time string to datetime if needed if isinstance(result_start_time, str): - simulation_time = datetime.fromisoformat( - result_start_time.replace("Z", "+00:00") - ) + # 如果是ISO格式字符串,解析并转换为UTC+8 + if result_start_time.endswith('Z'): + # UTC时间,转换为UTC+8 + utc_time = datetime.fromisoformat(result_start_time.replace("Z", "+00:00")) + simulation_time = utc_time.astimezone(UTC_8) + else: + # 假设已经是UTC+8时间 + simulation_time = datetime.fromisoformat(result_start_time) + if simulation_time.tzinfo is None: + simulation_time = simulation_time.replace(tzinfo=UTC_8) else: simulation_time = result_start_time + if simulation_time.tzinfo is None: + simulation_time = simulation_time.replace(tzinfo=UTC_8) # Prepare node data for batch insert node_data = [] @@ -379,9 +391,19 @@ class SchemeRepository: """ # Convert query_time string to datetime if isinstance(query_time, str): - target_time = datetime.fromisoformat(query_time.replace("Z", "+00:00")) + if query_time.endswith('Z'): + # UTC时间,转换为UTC+8 + utc_time = datetime.fromisoformat(query_time.replace("Z", "+00:00")) + target_time = utc_time.astimezone(UTC_8) + else: + # 假设已经是UTC+8时间 + target_time = datetime.fromisoformat(query_time) + if target_time.tzinfo is None: + target_time = target_time.replace(tzinfo=UTC_8) else: target_time = query_time + if target_time.tzinfo is None: + target_time = target_time.replace(tzinfo=UTC_8) # Create time range: query_time ± 1 second start_time = target_time - timedelta(seconds=1) @@ -422,9 +444,19 @@ class SchemeRepository: """ # Convert query_time string to datetime if isinstance(query_time, str): - target_time = datetime.fromisoformat(query_time.replace("Z", "+00:00")) + if query_time.endswith('Z'): + # UTC时间,转换为UTC+8 + utc_time = datetime.fromisoformat(query_time.replace("Z", "+00:00")) + target_time = utc_time.astimezone(UTC_8) + else: + # 假设已经是UTC+8时间 + target_time = datetime.fromisoformat(query_time) + if target_time.tzinfo is None: + target_time = target_time.replace(tzinfo=UTC_8) else: target_time = query_time + if target_time.tzinfo is None: + target_time = target_time.replace(tzinfo=UTC_8) # Create time range: query_time ± 1 second start_time = target_time - timedelta(seconds=1)