Files
TJWaterServer/time_api.py
2025-03-02 17:18:01 +08:00

90 lines
3.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import datetime
'''
2025-02-09T15:45:00+00:00 采用的是 ISO 8601 国际标准日期时间格式,具体特点如下:
日期部分YYYY-MM-DD年-月-日例如2025-02-09表示2025年2月9日。
时间部分HH:mm:ss时:分:秒例如15:45:00表示下午3点45分0秒。
分隔符日期与时间之间用字母T连接表明这是一个完整的时间点。
时区偏移:末尾的+00:00表示该时间基于协调世界时UTC即零时区。若使用Z替代+00:00如2025-02-09T15:45:00Z也符合ISO 8601标准两者等价
北京时间格式
2025-02-09T15:45:00+08:00
'''
def parse_utc_time(query_time: str) -> datetime.datetime:
'''
将一个北京时间的时间点转换成utc
'''
beijing_time = datetime.fromisoformat(query_time)
utc_time = beijing_time.astimezone(datetime.timezone.utc)
return utc_time
def parse_beijing_time(query_time: str) -> datetime.datetime:
'''
将一个 utc 的时间点,转换成北京时间
'''
utc_time = datetime.fromisoformat(query_time)
beijing_time = utc_time.astimezone(datetime.timezone(datetime.timedelta(hours=8)))
return beijing_time
def to_utc_time(dt: datetime.datetime) -> datetime.datetime:
'''
将一个北京时间的时间点转换成utc
'''
utc_time = dt.astimezone(datetime.timezone.utc)
return utc_time
def to_beijing_time(dt: datetime.datetime) -> datetime.datetime:
'''
将一个 utc 的时间点,转换成北京时间
'''
beijing_time = dt.astimezone(datetime.timezone(datetime.timedelta(hours=8)))
return beijing_time
def parse_date(query_time: str) -> datetime.date:
'''
将一个日期字符串,转换成日期
日期字符串格式YYYY-MM-DD
'''
return datetime.fromisoformat(query_time).date()
def to_time_range(dt: datetime, delta: float) -> tuple[datetime.datetime, datetime.datetime]:
'''
将一个时间点,转换成 start/end 时间段
有些查询按照一个时间点查不到,用时间段保证能成功
delta 单位是秒
'''
start_time = dt - datetime.timedelta(seconds=delta)
end_time = dt + datetime.timedelta(seconds=delta)
return (start_time, end_time)
def parse_date_range(query_time: str) -> tuple[datetime.datetime, datetime.datetime]:
'''
将一个日期字符串,转换成 start/end 时间段
日期字符串格式YYYY-MM-DD
'''
start_time = datetime.fromisoformat(query_time).date()
end_time = start_time + datetime.timedelta(days=1)
return (start_time, end_time)
def get_day_start(dt: datetime.date) -> datetime.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:
'''
获取 某一天的 23:59:59
这一天可以是北京时间,也可以是 utc 时间
'''
return dt.replace(hour=23, minute=59, second=59, microsecond=0)