Gestire il tempo è piuttosto complesso. Le comuni supposizioni errate sul tempo includono le seguenti.
- Un giorno consiste di 24 ore.
- Un'ora contiene 60 minuti.
- Una settimana consiste di sette giorni.
- 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:
- Flag della riga di comando:
flag
supportatime.Duration
tramitetime.ParseDuration
. - JSON:
encoding/json
supporta l'encoding ditime.Time
in una stringa RFC 3339 utilizzando il suo metodoUnmarshalJSON
. - SQL:
database/sql
supporta la conversione delle colonneDATETIME
oTIMESTAMP
intime.Time
e restituisce se il driver sottostante lo supporta. - YAML:
gopkg.in/yaml.v2
supporta l'utilizzo ditime.Time
come stringa RFC 3339 etime.Duration
tramitetime.ParseDuration
.
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.