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.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.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.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_beijing_date_range(query_time: str) -> tuple[datetime.datetime, datetime.datetime]: ''' 将一个日期字符串,转换成 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) 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: ''' 获取 某一天的 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)