Praca z różnymi strefami czasowymi w Go

Praca z różnymi strefami czasowymi w Go

Strefy czasowe są kluczowe dla każdej aplikacji obsługującej daty i godziny. Oczywiście dotyczy to zwłaszcza aplikacji obsługujących użytkowników na różnych kontynentach i w różnych lokalizacjach. Strefy czasowe określają przesunięcie względem uniwersalnego czasu koordynowanego (UTC) dla określonych lokalizacji na całym świecie. Odgrywają one istotną rolę w zapewnieniu dokładnej i niezawodnej obsługi czasu.

Go udostępnia pakiet czasu w swojej standardowej bibliotece do pracy z czasem i strefami czasowymi. Możesz pobierać i konwertować strefy czasowe w różnych lokalizacjach za pomocą pakietu czasowego.

Pakiet czasu

Pakiet czasu zapewnia funkcjonalność do pracy z czasem i datami, mierzenia i wyświetlania czasu oraz manipulowania datami przy użyciu kalendarza gregoriańskiego bez sekund przestępnych.

Pakiet time zawiera typ struktury Time zawierający pole lokalizacji, którego można użyć do ustawienia stref czasowych.

Możesz zaimportować pakiet czasu za pomocą instrukcji importu.

import "time"

Oto typ struktury czasu i jego pola. Pola są niewyeksportowane, więc nie ma ich w oficjalnej dokumentacji.

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
}

Wiele metod wykorzystuje struktury Time i Location , w tym metody stref czasowych.

Ładowanie informacji o strefie czasowej

Ładowanie informacji o strefie czasowej jest jedną z podstawowych operacji podczas pracy ze strefami czasowymi. Metoda LoadLocation zapewnia funkcjonalność ładowania informacji o strefie czasowej z bazy danych stref czasowych IANA . Metoda LoadLocation pobiera nazwę strefy czasowej i zwraca informacje o lokalizacji oraz błąd do obsługi. Po załadowaniu informacji o strefie czasowej tworzy instancję struktury czasowej powiązaną ze strefą czasową.

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)
}

Metoda In funkcji Now pobiera lokalizację i drukuje tam czas:

wynik wydrukowania aktualnego czasu w NY

Ponadto możesz użyć metody FixedZone , aby załadować bieżący czas w lokalizacji, jeśli znasz ciąg lokalizacji i przesunięcie strefy czasowej od czasu UTC. Najpierw musisz załadować bieżący czas w formacie UTC, a następnie użyjesz metody FixedZone, aby załadować lokalizację na podstawie ciągu i przesunięcia przed przekazaniem lokalizacji do metody In the time wystąpienia.

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)
}

Główna funkcja drukuje na konsoli aktualny czas w Lagos.

Pomiar czasu trwania strefy czasowej

Pakiet time udostępnia metodę Zone służącą do pobierania skrótu i ​​przesunięcia strefy czasowej skojarzonej z wartością time.Time . Metoda Zone zwraca ciąg reprezentujący skrót strefy czasowej (np. „EST” dla „Ameryka/Nowy_Jork”) oraz liczbę całkowitą reprezentującą liczbę sekund na wschód od 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)
}

W funkcji main metoda Zone mierzy czas trwania przesunięcia strefy czasowej między dwiema strefami czasowymi (wartości time.Time). Zmienna t1 to aktualny czas w UTC, a zmienna t2 to aktualny czas w strefie czasowej „America/New_York”.

Funkcja drukuje zmienną czasu trwania (różnica przesunięcia między strefami czasowymi) reprezentującą zmianę strefy czasowej w sekundach.

Ocena czasu między strefami czasowymi

Możesz oszacować czas między strefami czasowymi, jeśli znasz czas między strefami czasowymi. Możesz użyć metody Add metody In swojego wystąpienia struktury time.Time, aby dodać czas trwania do czasu w strefie czasowej.

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)
}

Funkcja ewaluacji Czasu przyjmuje instancję time.Time i czas trwania typu time.Duration , zwracając czas w strefie czasowej. Ładuje aktualny czas w „Africa/Lagos” i dodaje czas trwania do czasu.

Manipuluj czasem i datą za pomocą pakietu czasu

Pakiet czasu jest bardzo wszechstronny do pracy zarówno z godzinami, jak i datami. Pakiet time udostępnia funkcje, takie jak Unix() do konwersji czasu na czas uniksowy, Sleep() do wstrzymywania goroutines i Format() do formatowania wartości czasu na ciąg znaków.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *