web-dev-qa-db-fra.com

Tiques entre l'époque Unix et l'époque GPS

Quel est le nombre de tics d'une seconde entre l'heure Unix (01 janvier 1970) et l'heure GPS (06 janvier 1980)?

J'ai vu plusieurs réponses de plusieurs sources sur le Web. Un camp prétend que la réponse est 315964800 , l'autre prétend que c'est 315964819 . J'ai toujours pensé que c'était 315964800, mais maintenant je n'en suis pas si sûr.

Je viens de découvrir que ma base de référence logicielle utilise 315964819 depuis huit ans. J'ai du mal à comprendre comment cela aurait pu être de 19 secondes et personne ne l'a remarqué lorsque nous avons intégré nos appareils intégrés à d'autres appareils.

Je pense que celui qui a mis 315964819 dans la ligne de base du code doit avoir utilisé par erreur un décalage TAI (19 secondes).

D'après ce que je comprends, le temps Unix n'inclut pas les secondes intercalaires, ce qui m'indiquerait que 315964800 est le nombre de ticks entre les deux époques. Ensuite, je pense à la façon dont le temps Unix gère la seconde intercalaire. Il répète simplement le nombre de ticks quand il y a une seconde intercalaire insérée, et il y a étaient 19 secondes intercalaires insérées entre 1970 et 1980 ... Je commence à me demander si les ticks répétés importent. Je ne le pense pas, mais quelqu'un dans l'histoire de ce code l'a pensé, et cela a semblé fonctionner ...

En fin de compte, je suis sur le point de changer un ensemble constant dans les âges sombres de ce produit qui a à voir avec le timing, ce qui est important pour la plate-forme, de ce qu'il a été à ce que je crois être plus précis, et Je voulais une sorte de pouce levé de la part de personnes plus compétentes que moi.

Quelqu'un d'autorité peut-il intervenir ici?

camp 3159648

camp 315964819

Notez également que je ne pose que des questions sur Unix Epoch à GPS Epoch. Je suis sûr que nous avons des secondes intercalaires depuis que GPS Epoch a été correctement couvert.

23
kmort

Les différentes valeurs que vous avez indiquées sont dues au mélange du décalage de 1970 à 1980 avec des secondes intercalaires.
La valeur de décalage correcte est 315964800 secondes.

Explication:

Les temps UTC et GPS s'écartent (en moyenne) tous les 18 mois d'une seconde supplémentaire. C'est ce qu'on appelle une seconde intercalaire, introduite dans la base de temps UTC, nécessaire pour s'adapter aux changements de la rotation de la Terre.

Temps GPS non ajusté par seconde intercalaire.

Actuellement (2013), il y a un décalage de 16 secondes:
Temps GPS-UTC = 16 secondes

L'heure Unix est un format d'heure et non une référence d'heure. Il représente le nombre de millisecondes (ou secondes) depuis le 1.1.1970 UTC. Idéalement, l'heure de votre système est synchronisée avec UTC par un TimeServer (NTP).

Pour convertir et obtenir votre décalage, vous devez utiliser un décalage fixe: (6.1.1980 UTC - 1.1.1970 UTC)

et PUIS ajouter la valeur actuelle du GPS à l'écart UTC (actuellement 16 s). Par exemple, rendre cette valeur configurable ou lire le décalage actuel à partir d'un appareil GPS (ils connaissent la différence entre l'heure UTC et l'heure GPS)

Les différentes valeurs que vous avez indiquées sont dues au mélange de 1970 à 1980 compensé avec des secondes intercalaires. Ne faites pas cela, manipulez-les séparément.

Ce programme Java:

SimpleDateFormat df = new SimpleDateFormat();
df.setTimeZone(TimeZone.getTimeZone("UTC"));

Date x = df.parse("1.1.1970 00:00:00");
Date y = df.parse("6.1.1980 00:00:00");

long diff = y.getTime() - x.getTime();
long diffSec = diff / 1000;

System.out.println("diffSec= " + diffSec);

Sort cette valeur:

diffSec = 315964800

Il s'agit donc du décalage correct entre le 1.1.1970 UTC et le 6.1.1980 UTC où l'heure GPS a commencé. Ensuite, vous devez corriger 16 secondes supplémentaires qui ont été introduites depuis le 6.1.1980 et aujourd'hui, pour calculer l'heure GPS d'une heure UTC actuelle.

24
AlexWien

Quel est le nombre de tics d'une seconde entre l'heure Unix (01 janvier 1970) et l'heure GPS (06 janvier 1980)?

Il y a au moins deux réponses possibles:

  1. Quel est l'horodatage POSIX pour le 1980-01-06 UTC? Réponse: 315964800 (exactement), en Python:

    from datetime import datetime, timedelta
    print((datetime(1980,1,6) - datetime(1970,1,1)) // timedelta(seconds=1))
    

    C'est le nombre de secondes SI entre les dates sans compter les secondes intercalaires . En d'autres termes, le code montre combien de secondes "UT1" (~ 1/86400 d'une journée solaire moyenne) se sont écoulées entre les événements.

    UTC, les échelles de temps GPS cochent en secondes SI. L'UTC "oublie" les secondes intercalaires et, par conséquent, le nombre réel de secondes SI entre les dates est légèrement supérieur à l'horodatage POSIX.

    315964800 n'est pas la bonne réponse si vous voulez trouver écoulé secondes

  2. Combien de secondes SI se sont écoulées entre 1970-01-01 UTC et 1980-01-06 UTC? Réponse: 315964811 (environ).

Pour répondre à la deuxième question, vous devez savoir combien de secondes intercalaires intercalaires ont été insérées entre les deux dates (convertir UTC en International Atomic Time (TAI)):

#!/usr/bin/env python3
from datetime import datetime, timedelta

tai_posix_Epoch = datetime(1970, 1, 1) + timedelta(seconds=8, microseconds=82)
tai_gps_Epoch = datetime(1980, 1, 6) + timedelta(seconds=19)
print(round((tai_gps_Epoch - tai_posix_Epoch) / timedelta(seconds=1)))

La différence entre le temps TAI et le temps GPS est constante à moins de 10 secondes des nanosecondes.

Le temps entre 1970 et 1972 (quand UTC a été introduit) est un peu flou; la différence TAI-UTC n'est pas un nombre entier de secondes dans cette période :

from decimal import Decimal as D

MJD_1970_01_01 = 40587
dAT_1970_01_01 = D("4.213170") + (MJD_1970_01_01 - 39126) * D("0.002592")
# -> delta(AT) = TAI - UTC = Decimal('8.000082') # 8 seconds, 82 microseconds

Voici une image qui montre la relation entre les échelles de temps UT1, UTC et TAI au fil des ans : UTC-TAI Chaque étape est une seconde intercalaire commençant par TAI - UTC = 10s le 01-01-1972. 26 secondes intercalaires positives avaient été insérées au 1er juillet 2015.


315964819 l'horodatage pourrait être expliqué si 1970-01-01 00:00:00 TAI L'époque est utilisée:

print(datetime(1970, 1, 1) + timedelta(seconds=315964819)) # TAI
# 1980-01-06 00:00:19 TAI or 1980-01-06 00:00:00 UTC

c'est-à-dire exactement 315964819 SI secondes se sont écoulées entre 1970-01-01 00:00:00 TAI et 1980-01-06 00:00:00 UTC (note: les dates sont exprimées selon différentes échelles de temps).

les fuseaux horaires "à droite" utilisent 1970-01-01 00:00:10 TAI Epoch (préavis: 10 secondes) et donc l'horodatage correspondant pour l'Epoch GPS (1980-01-06 00:00:00 UTC) est 315964809 (pas 315964819). Voici une description succincte de la différence entre les horodatages "à droite" et POSIX :

Les "bons" fichiers de la base de données tz (zoneinfo) ont une différence subtile par rapport au standard POSIX. POSIX requiert que la valeur d'horloge système de time_t représente le nombre de secondes sans saut depuis le 01/01/1970. Cela revient à exiger que les secondes POSIX soient les secondes solaires moyennes d'UT, et non les secondes atomiques que UTC a comptées depuis le 1972-01-01.

Les fichiers zoneinfo "à droite" affirment que la valeur d'horloge système de time_t représente le nombre réel de secondes dans l'échelle de temps de diffusion approuvée internationalement depuis le 1970-01-01. Par conséquent, la valeur de time_t attendue par les "bons" fichiers zoneinfo est supérieure à la valeur de time_t spécifiée par POSIX. La différence dans les valeurs de time_t est le nombre de secondes intercalaires qui ont été insérées dans l'échelle de temps de diffusion approuvée internationalement. À partir de l'année 2015, la différence est 26 secondes.souligner est à moi


Quelqu'un d'autorité peut-il intervenir ici?

IERS BULLETIN C (les données que j'ai utilisées ci-dessus) est l'autorité sur les secondes intercalaires (et donc (indirectement) sur la différence entre les échelles de temps UTC et GPS).

12
jfs

Je suppose que je suis dans le troisième camp :)
Appelons cela comme il est:
2 904 548 141 415 381 930 "périodes [...] d'un atome de césium 133" mesurées à 0 degré Kelvin au géoïde. (donnez ou prenez quelques centaines de millions de périodes selon la définition TAI/SI que vous utilisez)

Réponse courte:

Cela dépend des échelles de temps (et des définitions de ces échelles de temps) que vous utilisez.

15964809 en secondes TAI (définition 1977) et donc en secondes UTC
159648 en secondes UNIX
(les deux sont égaux entre eux mais UNIQUEMENT entre vos dates spécifiées et correspondent à 2 904 548 141 415 381 930 "périodes [...]")
Veuillez noter que les secondes UNIX rejouent la même seconde après la fin d'une seconde intercalaire UTC, de sorte que les secondes UTC, 2012-06-30 23:59:60 UTC et 2012- 07-01 00:00:00 UTC, étaient tous deux représentés par un horodatage UNIX de 1341100800.

Réponse détaillée:

en utilisant les secondes TAI
Même si elles ne le sont pas vraiment, supposons que toutes les secondes TAI avant 1977 sont toujours exactement égales à la définition 1977/1997 des secondes TAI/SI.
Supposons également qu'en
"Epoque de l'heure Unix (01 janv. 1970)" à "Epoque de l'heure GPS (06 janv. 1980)"
vous voulez dire
1970-01-01 00:00:10 TAI au 1980-01-06 00:00:19 TAI
dans ce cas, il y aurait
(((365 jours/an * 10 ans) + 2 jours bissextiles + 5 jours) * 86400 TAI secondes/jour) + 9 TAI secondes
= 15964809 secondes TAI

en utilisant UNIX secondes
Même s'ils ne le sont pas vraiment, supposons que la durée d'une seconde UTC avant 1977 soit toujours exactement égale à la définition 1977/1997 d'une seconde TAI/SI.
Supposons également qu'en
"Epoque de l'heure Unix (01 janv. 1970)" à "Epoque de l'heure GPS (06 janv. 1980)"
vous voulez dire
1970-01-01 00:00:00 UTC au 1980-01-06 00:00:00 UTC
et que le temps UNIX recule d'une seconde après la fin d'une seconde intercalaire
dans ce cas, il y aurait
(((365 jours/an * 10 ans) + 2 jours bissextiles + 5 jours) * 86400 secondes/jour) + 9 secondes bissextiles - 9 reprises de seconde bissextile unix
= 159648 secondes UNIX

Concernant les "périodes [...]"
Une seconde TAI/SI de 1977/1997 est ce qui a été utilisé pour obtenir 315964809 secondes de 9 192 631 770 périodes = 2 904 548 141 415 381 930 périodes. Une seconde SI 1997 est égale à la durée de 9192 631 770 périodes de rayonnement correspondant à la transition entre les deux niveaux hyperfin de l'état fondamental du césium-133 atom au repos à une température de 0 K. La définition de 1977 du TAI mesure les secondes SI au géoïde.

4
chimeraha

revenir à la question d'origine, "Epoque de l'heure Unix (01 janvier 1970)" à "Epoque de l'heure GPS (06 janvier 1980)", donc l'Epoch est 315964800, 315964819 est l '"Epoque TAI" à l' "Epoque de l'heure GPS". ce qui signifie 315964819 = 315964800 + 19. la valeur Epoch que vous utilisez dans le code dépend donc de l'heure que vous utilisez.

1
Long Jonathan