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.