闰秒和周内秒¶
- 示例
查看...查看...
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))