Il tempo Unix o il tempo Posix (chiamato anche timestamp Unix ) è una misura del tempo basata sul numero di secondi trascorsi1 ° gennaio 197000:00:00 UTC , esclusi i secondi intercalari . Viene utilizzato principalmente nei sistemi conformi allo standard POSIX , inclusi i sistemi simili a Unix , da cui il nome. È la rappresentazione POSIX del tempo.
Per associare un evento a un numero reale, è sufficiente utilizzare riferimenti naturali e universali: ad esempio, le periodicità di rotazione della Terra su se stessa e attorno al Sole. Questi periodi sono sufficienti per stabilire calendari , cioè relazioni tra eventi e date, anche se è necessario uno sforzo per definire chiaramente i riferimenti utilizzati (ogni paese ha il suo, tutti adottati in tempi diversi.); le date di questi calendari sono solo numeri espressi in un sistema di numerazione alquanto complicato che ha come unità il giorno, la settimana, il mese, la stagione, l'anno, ecc., e l'ora di Posix non è che un riferimento tra gli altri espressa come un semplice numero.
Principali sistemi di misura utilizzatiEcco i principali sistemi di misurazione del tempo che sono stati immaginati e utilizzati fino ad oggi:
Acronimo | Senso | Definizione |
---|---|---|
GMT | Greenwich Mean Time | Ancora in uso in alcuni paesi per aspetti legali.
Tuttavia, la definizione di questo sistema di misurazione è ambigua. Questo è il motivo per cui, a parte questo utilizzo amministrativo, è preferibile utilizzare UTC. |
Ut | Tempo universale | Questo sistema definisce il giorno come la durata media della rotazione della Terra attorno al proprio asse.
Questa definizione pone alcune difficoltà perché la velocità di questa rotazione non è costante, diminuisce lentamente per effetto delle maree e, inoltre, presenta irregolarità imprevedibili: la durata dei giorni UT è leggermente superiore, in media, a 86.400 secondi ( numero di secondi in 24 ore). La differenza è dell'ordine di un secondo in uno o tre anni. Esistono diverse versioni di UT: UT0, UT1, UT1R, UT2. Fare riferimento all'articolo " Tempo universale " per maggiori dettagli. |
TAI | Ora atomica internazionale | Questo sistema si basa su una definizione internazionale del secondo. Il suo standard è costituito da diversi orologi atomici distribuiti in tutto il mondo. La misurazione del tempo in questo sistema è rigorosamente regolare a differenza del precedente per il quale il suo standard non ha la stessa regolarità. Di conseguenza, TAI e UT si allontanano gradualmente l'uno dall'altro a causa del rallentamento del secondo.
|
UTC | Tempo universale coordinato |
Questo sistema è adottato come base del tempo civile internazionale da un gran numero di paesi. La parola "coordinato" indica che:
In altre parole, UTC è identico a TAI (ha la sua stabilità e accuratezza) fino a un numero intero di secondi, il che gli consente di aderire a UT con l' approssimazione di 0.9 s ; questo è ciò che mostra la figura a fianco.
|
Per misurare il tempo, devi scegliere un'origine:
È necessario indicare come si evolve questo numero al passare del tempo:
# | TAI | UTC | TAI - UTC | Tempo positivo | |
---|---|---|---|---|---|
1 | 01-01-2009T00: 00: 30 | 31-12-2008T23: 59: 57 | 33 | 1.230.767.997 | |
2 | 01-01-2009T00: 00: 31 | 31-12-2008T23: 59: 58 | 33 | 1.230.767.998 | |
3 | 01-01-2009T00: 00: 32 | 31-12-2008T23: 59: 59 | 33 | 1.230.767.999 | |
4 | 01-01-2009T00: 00: 33 | 31-12-2008T23: 59: 60 | 33 | 1.230.768.000 | aggiunta di un secondo intercalare |
5 | 01-01-2009T00: 00: 34 | 01-01-2009T00: 00: 00 | 34 | 1.230.768.000 | |
6 | 01-01-2009T00: 00: 35 | 01-01-2009T00: 00: 01 | 34 | 1.230.768.001 | |
7 | 01-01-2009T00: 00: 36 | 01-01-2009T00: 00: 02 | 34 | 1.230.768.002 |
Il Posix Time non è una rappresentazione lineare del tempo, ci sono anomalie, come la riga 5 della tabella sopra.
Nessuna corrispondenza biiettiva tra l'ora UTC e l'ora di Posix; quest'ultimo non permette di rappresentare i secondi intercalari presenti in UTC, come la riga 4 della tabella sopra: 2008-12-31T23: 59: 60 UTC.
Questi diversi riferimenti non devono essere confusi (ad esempio, l'anno zero di un calendario non inizia contemporaneamente a quello di un altro) e anche perché tutti questi calendari devono adattarsi a periodi non multipli. L'uno dall'altro, ad esempio anni bisestili o le irregolarità di queste periodicità. Questi adattamenti complicano un po 'i calcoli, a seconda della precisione che stai cercando; ad esempio, un anno è trascorso può essere un'informazione sufficiente oppure sarà necessario tenere conto del carattere intercalare dell'anno per rispondere alla stessa domanda espressa in numero di giorni. Ciò significa che dobbiamo conservare un ricordo del passato, il ricordo di ogni secondo che passa.
Nella maggior parte dei casi, è sufficiente una semplice differenza nei tempi di Posix, a meno che i due eventi non si trovino a cavallo di uno o più secondi intercalari. Per calcolare un ritardo esatto in tutte le circostanze, è necessario tenere conto dei secondi intercalari.
Tuttavia, il verificarsi di secondi intercalari è basso, quindi la probabilità di commettere un tale errore è bassa; e se nonostante tutto il caso si verifica, l'entità dell'errore potrebbe essere piccola e non è necessario preoccuparsi di quei secondi intercalari in questo caso; la tabella seguente mostra diversi esempi.
Il metodo per completare una riga di questa tabella è il seguente:
Applicando questo metodo per i tempi M = 10, 100, 1000 si ottiene la seguente tabella:
Tempo per misurare (M) | Probabilità di errore | Entità dell'errore |
---|---|---|
10 s | 3,2 × 10-7 | 10% |
100 s | 3,2 × 10-6 | 1% |
1000 s | 3,2 × 10-5 | 0,1% |
In definitiva, se il tempo per calcolare tra i due eventi di interesse è di un anno, la probabilità è del 100% di commettere un errore di 3,2 × 10-8 .
La probabilità di commettere un dato errore e l'entità di questo errore variano inversamente l'una rispetto all'altra; un altro modo per dirlo potrebbe essere dire:
Se questa coppia (probabilità di commettere un errore / grandezza dell'errore) è inaccettabile, o se non sappiamo come valutare l'impatto, allora è sicuramente necessario chiederci perché usiamo UTC e qual è la necessità di precisione necessaria, ovvero per prevedere l'utilizzo di tabelle da aggiornare non appena si programma l'inserimento / rimozione di un secondo intercalare.
Conversione da UTC a Posix TimeA parte le rarissime anomalie sopra menzionate riguardanti i secondi intercalari, è facile convertire un tempo UTC in un tempo Posix e viceversa.
Esempio: qual è l'ora di Posix all'inizio della giornata di 1 ° gennaio 2009(riga 5 della tabella 1 sopra):
Numero di giorni trascorsi | ||||
---|---|---|---|---|
1.970 | 1 971 | 1 972 | 1973 | 3 * 365 + 366 = 1461 |
1.974 | 1 975 | 1 976 | 1 977 | 1461 |
1 978 | 1 979 | 1 980 | diciannove ottantuno | 1461 |
1 982 | 1 983 | 1 984 | 1 985 | 1461 |
1.986 | 1 987 | 1 988 | 1 989 | 1461 |
1990 | 1.991 | 1.992 | 1.993 | 1461 |
1 994 | 1.995 | 1.996 | 1997 | 1461 |
1.998 | 1.999 | 2.000 | 2.001 | 1461 |
2.002 | 2.003 | 2004 | 2.005 | 1461 |
2.006 | 2.007 | 2.008 | 2 * 365 + 366 = 1096 | |
14 245 |
Esistono anche strumenti che eseguono questi calcoli in modo molto semplice, come questo "script di shell" per convertire un numero di secondi dall'era Posix in una data:
#!/bin/sh # convertir un nombre de secondes depuis l'époque Posix # en date # exemple: date -u -R --date "1970-01-01 1230768000 seconds" date -u -R --date "1970-01-01 $* seconds" Conversione di un'ora Posix in ora UTCIl calcolo inverso non presenta alcuna difficoltà, e allo stesso modo ci sono strumenti che eseguono questi calcoli in modo molto semplice, come questo script bash per convertire una data in un numero di secondi dall'epoca di Posix:
#!/bin/sh # convertir une date (attention au format de l'argument) # en nombre de secondes depuis l'époque Posix # exemple: date --date "2009-01-01 00:00:00+00:00" "+%s" date --date "$*" "+%s"Il metodo più comune per leggere l'ora in Unix è la chiamata alla seguente funzione che restituisce un valore numerico di tipo " time_t".
time_t time(NULL);Questo tipo time_t è comunemente usato per manipolare l'ora UNIX, sfortunatamente lo standard POSIX non specifica (chiaramente) la sua dimensione:
Tempo di Unix | UTC | |
---|---|---|
prima data: -2 31 | −2 147 483 648 | 1901-12-13 T 20:45:52 |
Era Unix: 0 | 0 | 01/01/1970 T 00:00:00 |
prima data: 2 31 -1 | 2.147.483.647 | 2038-01-19 T 03:14:07 |
Questa impossibilità di rappresentazione non mette necessariamente in discussione il funzionamento della macchina stessa, cioè il funzionamento del suo sistema operativo, ma il funzionamento delle sue applicazioni e la sua interoperabilità con altre macchine. Non basta infatti che una macchina sappia gestire localmente questo limite, ma è anche necessario che tutte le macchine ad essa collegate siano in grado di gestire questo limite e questo allo stesso modo.
Possono sorgere diversi casi:
I sistemi Unix generalmente mantengono un contatore la cui risoluzione è più fine del secondo. È possibile accedere a questo tempo chiamando la seguente funzione:
int gettimeofday(struct timeval *tv, NULL);Il valore numerico restituito da questa funzione è memorizzato nella variabile " struct timeval *tv " definita come segue:
struct timeval { int tv_sec; /* secondes */ int tv_usec; /* microsecondes de 0 à 999999 */ };L'uso di questa risoluzione inferiore al secondo solleva la questione di cosa succede quando viene aggiunto o sottratto un secondo intercalare? Sembra che questo punto sia responsabilità del sistema operativo. In assenza di una specifica chiara, sono quindi possibili diversi scenari a seconda del sistema operativo considerato. I tre esempi seguenti mostrano le tre categorie di casi che sembrano le più rappresentative, trattano solo l'aspetto dell'inserimento di un secondo intercalare ma potrebbero essere facilmente adattate al caso di cancellazione:
# | UTC | tv_sec | tv_usec | |
---|---|---|---|---|
4 | 31-12-2008T23: 59: 60.000 | 1.230.768.000 | 0 | |
31-12-2008T23: 59: 60.500 | 1.230.768.000 | 500.000 | ||
5 | 01-01-2009T00: 00: 00.000 | 1.230.768.000 | 0 | il tempo si aggiustò improvvisamente |
2009-01-01T00: 00: 00.500 | 1.230.768.000 | 500.000 | ||
6 | 01-01-2009T00: 00: 01.000 | 1.230.768.001 | 0 |
# | UTC | tv_sec | tv_usec | |
---|---|---|---|---|
4 | 31-12-2008T23: 59: 60.000 | 1.230.768.000 | 0 | |
31-12-2008T23: 59: 60.500 | 1.230.768.000 | 0 | ora congelata | |
5 | 01-01-2009T00: 00: 00.000 | 1.230.768.000 | 0 | ora congelata |
2009-01-01T00: 00: 00.500 | 1.230.768.000 | 500.000 | ||
6 | 01-01-2009T00: 00: 01.000 | 1.230.768.001 | 0 |
# | UTC | tv_sec | tv_usec | |
---|---|---|---|---|
4 | 31-12-2008T23: 59: 60.000 | 1.230.768.000 | 0 | |
31-12-2008T23: 59: 60.500 | 1.230.768.000 | 250.000 | ha rallentato il tempo | |
5 | 01-01-2009T00: 00: 00.000 | 1.230.768.000 | 500.000 | ha rallentato il tempo |
2009-01-01T00: 00: 00.500 | 1.230.768.000 | 750.000 | ha rallentato il tempo | |
6 | 01-01-2009T00: 00: 01.000 | 1.230.768.001 | 0 |
L'idea di utilizzare il tempo atomico internazionale è già stata proposta e difesa da molte persone, ma non è questo il significato dato dalla storia, la scelta scelta è stata quella che oggi è congelata dallo standard POSIX.
Daniel J. Bernstein ha anche scritto articoli e software per l'uso di TAI su sistemi tipo UNIX.
Il gigasecondo Unix si riferisce all'ora Unix 10 9 , che rappresenta il9 settembre 2001.