import requests
from datetime import datetime, timedelta
def fetch_leap_second_data():
url = "https://hpiers.obspm.fr/iers/bul/bulc/Leap_Second.dat"
try:
response = requests.get(url, timeout=15)
response.raise_for_status()
data = response.text
except requests.Timeout:
return None
except requests.RequestException as e:
return None
leap_seconds = []
for line in data.split('\n'):
if line.startswith('#') or not line.strip():
continue
parts = line.split()
if len(parts) >= 3:
try:
mjd = float(parts[0])
date_str = f"{parts[1]} {parts[2]} {parts[3]}"
tai_utc = int(parts[4])
date_obj = datetime.strptime(date_str, "%d %m %Y")
leap_seconds.append({
'mjd': mjd,
'date': date_obj,
'tai_utc': tai_utc,
'gps_utc': tai_utc - 19 # GPS = TAI - 19秒
})
except (ValueError, IndexError):
continue
leap_seconds.sort(key=lambda x: x['date'])
if leap_seconds:
return leap_seconds[-1]['gps_utc']
else:
return None
def get_time_str(gps_week, week_seconds, gps_utc_offset):
gps_seconds = gps_week * 7 * 24 * 3600 + week_seconds
gps_epoch = datetime(1980, 1, 6, 0, 0, 0)
gps_time = gps_epoch + timedelta(seconds=gps_seconds)
utc_time = gps_time - timedelta(seconds=gps_utc_offset)
time_str = f"{utc_time.year:04d}-{utc_time.month:02d}-{utc_time.day:02d} {utc_time.hour:02d}:{utc_time.minute:02d}:{utc_time.second:02d},{round(utc_time.microsecond/1000):03d}"
return time_str
if __name__ == "__main__":
gps_week = 2370
week_seconds = 313218.23
gps_utc_offset = fetch_leap_second_data()
if gps_utc_offset is None:
gps_utc_offset = 18
print(get_time_str(gps_week, week_seconds, gps_utc_offset))