Gestire il tempo è piuttosto complesso. Le comuni supposizioni errate sul tempo includono le seguenti.

  1. Un giorno consiste di 24 ore.
  2. Un'ora contiene 60 minuti.
  3. Una settimana consiste di sette giorni.
  4. Un anno è composto da 365 giorni.

Ad esempio, 1 indica che aggiungere 24 ore a un punto specifico nel tempo non sempre porta a un nuovo giorno nel calendario.

Pertanto, quando si tratta di gestire il tempo, utilizzare sempre il pacchetto "time" poiché aiuta a gestire queste supposizioni errate in modo più sicuro e accurato.

Utilizzo di time.Time per Rappresentare il Tempo Istantaneo

Nel gestire il tempo istantaneo, utilizzare time.Time e i suoi metodi per confrontare, aggiungere o sottrarre tempo.

Non consigliato:

func isActive(now, start, stop int) bool {
  return start <= now && now < stop
}

Consigliato:

func isActive(now, start, stop time.Time) bool {
  return (start.Before(now) || start.Equal(now)) && now.Before(stop)
}

Utilizzo di time.Duration per Rappresentare le Durate del Tempo

Nel gestire le durate del tempo, utilizzare time.Duration.

Non consigliato:

func poll(delay int) {
  for {
    // ...
    time.Sleep(time.Duration(delay) * time.Millisecond)
  }
}
poll(10) // È in secondi o millisecondi?

Consigliato:

func poll(delay time.Duration) {
  for {
    // ...
    time.Sleep(delay)
  }
}
poll(10*time.Second)

Tornando all'esempio iniziale, quando si aggiungono 24 ore a un tempo istantaneo, il metodo utilizzato dipende dall'intento. Se vogliamo lo stesso punto nel tempo il giorno successivo (il giorno dopo il giorno corrente), dovremmo utilizzare Time.AddDate. Tuttavia, se vogliamo assicurarci che un certo momento sia 24 ore dopo il precedente, dovremmo utilizzare Time.Add.

newDay := t.AddDate(0 /* anni */, 0 /* mesi */, 1 /* giorni */)
maybeNewDay := t.Add(24 * time.Hour)

Uso di time.Time e time.Duration con Sistemi Esterni

Quando possibile, utilizzare time.Duration e time.Time nell'interazione con sistemi esterni, ad esempio:

Quando time.Duration non può essere utilizzato in queste interazioni, utilizzare int o float64 e includere l'unità nel nome del campo.

Ad esempio, poiché encoding/json non supporta time.Duration, l'unità è inclusa nel nome del campo.

Non consigliato:

// {"interval": 2}
type Config struct {
  Interval int `json:"interval"`
}

Consigliato:

// {"intervalMillis": 2000}
type Config struct {
  IntervalMillis int `json:"intervalMillis"`
}

Quando time.Time non può essere utilizzato in queste interazioni, a meno che non sia diversamente concordato, utilizzare string e formattare i timestamp secondo RFC 3339. Per impostazione predefinita, Time.UnmarshalText utilizza questo formato e può essere utilizzato in Time.Format e time.Parse tramite time.RFC3339.

Anche se non è un problema pratico, si noti che il pacchetto "time" non supporta il parsing dei timestamp con secondo intercalare (8728), e non tiene conto dei secondi intercalari nei calcoli (15190). Se si confrontano due momenti nel tempo, la differenza non includerà eventuali secondi intercalari che possono essere avvenuti tra quei due momenti.