将时间范围字符串转换为毫秒时间戳,正确处理夏令时
(time_range_str)
| 335 | |
| 336 | |
| 337 | def convert_to_timestamps(time_range_str): |
| 338 | """ |
| 339 | 将时间范围字符串转换为毫秒时间戳,正确处理夏令时 |
| 340 | """ |
| 341 | # 提取时间和时区 |
| 342 | pattern = r"(\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2})\s*-\s*(\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2})\s*(?:\d{2}:\d{2})?\s*\(UTC([+-]?\d+)\)" |
| 343 | match = re.search(pattern, time_range_str) |
| 344 | |
| 345 | if not match: |
| 346 | raise ValueError(f"无法解析时间字符串: {time_range_str}") |
| 347 | |
| 348 | start_time_str, end_time_str, utc_offset = match.groups() |
| 349 | utc_offset = int(utc_offset) |
| 350 | |
| 351 | # 使用正确的时区对象 - 更智能地处理夏令时 |
| 352 | # 对于UTC-5,使用美国东部时间或类似时区 |
| 353 | if utc_offset == -5: |
| 354 | # 使用美国东部时区,会自动处理夏令时 |
| 355 | tz = pytz.timezone("America/New_York") |
| 356 | else: |
| 357 | # 使用固定偏移时区(不处理夏令时) |
| 358 | tz = pytz.FixedOffset(utc_offset * 60) # pytz使用分钟作为偏移 |
| 359 | |
| 360 | # 解析时间字符串并附加时区信息 |
| 361 | naive_start = datetime.strptime(start_time_str, "%Y-%m-%d %H:%M") |
| 362 | naive_end = datetime.strptime(end_time_str, "%Y-%m-%d %H:%M") |
| 363 | |
| 364 | # 正确地将naive时间本地化到指定时区 |
| 365 | start_time = tz.localize(naive_start) |
| 366 | end_time = tz.localize(naive_end) |
| 367 | |
| 368 | # 如果结束时间是xx:59格式,添加59秒 |
| 369 | if end_time.minute == 59: |
| 370 | end_time = end_time.replace(second=59) |
| 371 | |
| 372 | # 转换为UTC毫秒时间戳 |
| 373 | start_timestamp_ms = int(start_time.timestamp() * 1000) |
| 374 | end_timestamp_ms = int(end_time.timestamp() * 1000) |
| 375 | |
| 376 | return start_timestamp_ms, end_timestamp_ms |
| 377 | |
| 378 | |
| 379 | def process_combat_duration_cn(duration: str): |