Lavorare con diversi fusi orari in Go

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ì:

risultato della stampa dell'ora corrente a New York

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

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *