Tempo Assoluto
Unix e Linux rappresentano i tempi come nanosecondi e millisecondi trascorsi da un'epoca di riferimento,che è la mezzanotte del primo gennaio, per Unix del 1970 e per Linux del 1980.
(490epoch.go):
package main
import "fmt"
import "time"
func main() {
// L'ora è tenuta internamente dai computer come tempo
// passato dalle ore 00:00:00 GMT del 1/1/70
// E' convenzione Unix che tutti gli orologi interni
// tengano GMT e la conversione avvenga con 'zoneinfo'
// Display in formato ISO
now := time.Now()
// Display in secondi
secs := now.Unix()
// Display in nanosecondi
nanos := now.UnixNano()
fmt.Println(now)
// I millisecondi devono essere calcolati
millis := nanos / 1000000
fmt.Println(secs)
fmt.Println(millis)
fmt.Println(nanos)
// Convertire un numero di secondi a formato ISO
fmt.Println(time.Unix(secs, 0))
// Con precisione Unix al nanosecondo
fmt.Println(time.Unix(0, nanos))
// I nanosecondi non sono mai precisi del tutto
// nemmeno per calcoli interni di differenze
// Lo schedulatore Unix ha risoluzione 1 millisecondo
// Non è detto che i valori siano accurati a meno
// che sia attivo il Network Time Protocol
}
Il fatto che un timestamp sia rappresentabile al nanosecondo (o anche al millisecondo) non è nessuna garanzia di verità.
Se il sistema riceve i tempi da un server NTP (Network Time Protocol), si può assumere al massimo un'accuratezza di un secondo.
Questa è una considerazione importante tenendo conto che si possono avere programmi in comunicazione remota a distanze globali (a livello del nanosecondo interverrebbero anche effetti relativistici).
Inoltre lo schedulatore Unix/Linux ha un Time Slice dell'ordine dei 10 millisecondi, e a questo livello quale sia la routine attiva diventa aleatorio.