Lavorare con diversi fusi orari in Go
I fusi orari sono fondamentali per qualsiasi applicazione che si occupa di date e orari. Naturalmente, questo è particolarmente vero per le app che servono utenti in continenti e località. I fusi orari determinano l’offset dal Coordinated Universal Time (UTC) per località specifiche in tutto il mondo. Svolgono un ruolo fondamentale nel garantire una gestione del tempo accurata e affidabile.
Go fornisce il pacchetto orario nella sua libreria standard per lavorare con l’ora e i fusi orari. Puoi recuperare e convertire i fusi orari in varie località utilizzando il pacchetto orario.
Il Pacchetto Tempo
Il pacchetto ora fornisce funzionalità per lavorare con orari e date, misurare e visualizzare l’ora e manipolare le date utilizzando un calendario gregoriano senza secondi intercalari.
Il time package fornisce un tipo di struct Time contenente il campo location che puoi utilizzare per impostare i fusi orari.
È possibile importare il pacchetto orario con un’istruzione di importazione.
import "time"
Ecco il tipo di struttura temporale e i suoi campi. I campi non sono esportati, quindi sono assenti dalla documentazione ufficiale.
package main
type Time struct {
// wall is the wall time in the format returned by the runtime.nanotime()
// function.
wall uint64
// ext is the monotonic clock reading in the format returned by
// runtime.nanotime().
ext int64
// loc is a pointer to the Location struct associated with this time.
loc *Location
}
type Location struct {
// name is the time zone name, such as "UTC"or "PST".
name string
// zone contains information about the time zone abbreviation, offset,
// and rule for a single time zone in the location.
zone []zone
// tx contains information about when the time zone abbreviation or
// offset changes for a location.
tx []zoneTrans
// extend contains the name of a parent time zone if this location
// extends from another one.
extend string
// cacheStart and cacheEnd are Unix timestamps that deine the range
// for which the cacheZone field is valid.
cacheStart int64
cacheEnd int64
// cacheZone points to the zone that is currently valid for the time
// range defined by cacheStart and cacheEnd.
cacheZone *zone
}
Molti metodi utilizzano le strutture Time e Location , inclusi i metodi del fuso orario.
Caricamento delle informazioni sul fuso orario
Il caricamento delle informazioni sul fuso orario è una delle operazioni di base quando si lavora con i fusi orari. Il metodo LoadLocation fornisce funzionalità per il caricamento delle informazioni sul fuso orario dal database dei fusi orari IANA . Il metodo LoadLocation accetta il nome del fuso orario e restituisce le informazioni sulla posizione e un errore per la gestione. Dopo aver caricato le informazioni sul fuso orario, crea un’istanza time struct associata al fuso orario.
import (
"fmt"
"time"
)
func main() {
// Load the time zone location for America/New_York
loc, err: = time.LoadLocation("America/New_York")
if err! = nil {
fmt.Println("Error loading location:", err)
return
}
// Get the current time at a location
now: = time.Now().In(loc)
fmt.Println("Current time in New York:", now)
}
Il metodo In della funzione Now prende in una posizione e stampa l’ora lì:
Inoltre, puoi usare il metodo FixedZone per caricare l’ora corrente in una posizione se conosci la stringa della posizione e l’offset del fuso orario dall’ora UTC. Innanzitutto, dovrai caricare l’ora corrente in UTC, quindi utilizzerai il metodo FixedZone per caricare la posizione in base alla stringa e all’offset prima di passare la posizione al metodo In dell’istanza di tempo.
import (
"fmt"
"time"
)
func main() {
// Get the current time in UTC
now: = time.Now().UTC()
// Set the time zone for Lagos
lagos: = now.In(time.FixedZone("WAT", 3600))
// Print the current time in both locations
fmt.Println("Current time in Lagos:", lagos)
}
La funzione principale stampa l’ora corrente a Lagos sulla console.
Misurazione della durata del fuso orario
Il pacchetto time fornisce il metodo Zone per recuperare l’abbreviazione e l’offset del fuso orario associato a un valore time.Time . Il metodo Zone restituisce la stringa che rappresenta l’abbreviazione del fuso orario (es. “EST” per “America/New_York”) e un numero intero che rappresenta il numero di secondi a est dell’UTC.
import (
"fmt"
"time"
)
func main() {
// Load the time zone location for America/New_York
loc, err: = time.LoadLocation("America/New_York")
if err! = nil {
fmt.Println("Error loading location:", err)
return
}
// Get the current time in UTC and the specified location
t1: = time.Now()
t2: = t1.In(loc)
// Get the offset in seconds for each time zone
//for the time zones
_, offset1: = t1.Zone()
_, offset2: = t2.Zone()
// Calculate the duration of the time zone shift
// between UTC and America/New_York
duration: = offset2 - offset1
fmt.Printf("The time zone shift duration" +
"between UTC and New York is: %d seconds", duration)
}
Nella funzione principale, il metodo Zone misura la durata dello spostamento del fuso orario tra due fusi orari (valori time.Time). La variabile t1 è l’ora corrente in UTC e la variabile t2 è l’ora corrente nel fuso orario “America/New_York”.
La funzione stampa la variabile di durata (la differenza di offset tra i fusi orari) che rappresenta lo spostamento del fuso orario in secondi.
Valutazione del tempo tra i fusi orari
Puoi valutare il tempo tra i fusi orari se conosci la durata tra i fusi orari. Puoi usare il metodo Add del metodo In della tua istanza time.Time struct per aggiungere una durata all’ora in un fuso orario.
import (
"log"
"time" // import the time package
)
func evaluateTime(t time.Time, duration time.Duration) time.Time {
// load the location for Africa/Lagos
location, err: = time.LoadLocation("Africa/Lagos")
if err! = nil {
log.Println("There was an error loading the location")
}
return t.In(location).Add(duration)
}
La funzionevaluaTime accetta un’istanza time.Time e una durata di tipo time.Duration , restituendo l’ora nel fuso orario. Carica l’ora corrente in “Africa/Lagos” e aggiunge una durata all’ora.
Manipola ora e data con il pacchetto Time
Il pacchetto orario è molto versatile per lavorare con orari e date. Il pacchetto time fornisce funzioni come Unix() per convertire il tempo in tempo Unix, Sleep() per mettere in pausa le goroutine e Format() per formattare i valori del tempo in stringhe.
Lascia un commento