Časová pásma jsou zásadní pro každou aplikaci, která se zabývá daty a časy. To samozřejmě platí zejména pro aplikace, které slouží uživatelům napříč kontinenty a lokalitami. Časová pásma určují posun od koordinovaného světového času (UTC) pro konkrétní místa po celém světě. Hrají zásadní roli při zajišťování přesného a spolehlivého zpracování času.
Go poskytuje časový balíček ve své standardní knihovně pro práci s časem a časovými pásmy. Pomocí časového balíčku můžete načíst a převést časová pásma na různých místech.
Časový balíček
The čas balíček poskytuje funkce pro práce s časy a daty, měření a zobrazování času a manipulace s daty pomocí gregoriánského kalendáře bez přestupných sekund.
Časový balíček poskytuje a Častyp struktury obsahující pole umístění, které můžete použít k nastavení časových pásem.
Časový balíček můžete importovat pomocí příkazu importu.
import"čas"
Zde je typ časové struktury a její pole. Pole nejsou exportována, takže v oficiální dokumentaci chybí.
balík hlavní
typ Čas strukturovat {
// stěna je čas zdi ve formátu vráceném runtime.nanotime()
// funkce.
stěna uint64// ext je monotónní čtení hodin ve formátu, který vrací
// runtime.nanotime().
ext int64// loc je ukazatel na strukturu Location spojenou s tímto časem.
loc *Umístění
}typ Umístění strukturovat {
// název je název časového pásma, například "UTC" nebo "PST".
název tětiva// zóna obsahuje informace o zkratce časového pásma, offsetu,
// a pravidlo pro jedno časové pásmo v místě.
zóna []zóna// tx obsahuje informaci o tom, kdy je zkratka časového pásma resp
// kompenzuje změny pro umístění.
tx []zoneTrans// extend obsahuje název nadřazeného časového pásma, pokud je toto umístění
// přesahuje z jiného.
rozšířit tětiva// cacheStart a cacheEnd jsou časová razítka Unixu, která určují rozsah
// pro které je pole cacheZone platné.
cacheStart int64
cacheEnd int64
// cacheZone ukazuje na zónu, která je aktuálně platná pro daný čas
// rozsah definovaný cacheStart a cacheEnd.
cacheZone *zóna
}
Mnoho metod používá čas a Umístění struktur, včetně metod časového pásma.
Načítání informací o časovém pásmu
Načítání informací o časovém pásmu je jednou ze základních operací při práci s časovými pásmy. The LoadLocation metoda poskytuje funkce pro načítání informací o časovém pásmu z Databáze časových pásem IANA. The LoadLocation metoda převezme název časového pásma a vrátí informace o umístění a chybu pro zpracování. Jakmile načte informace o časovém pásmu, vytvoří a čas instance struktury spojená s časovou zónou.
import (
"fmt"
"čas"
)funchlavní() {
// Načte umístění časového pásma pro America/New_York
loc, chyba := čas. LoadLocation("Amerika/New_York")-li chyba!= nula {
fmt. Println("Chyba při načítání umístění:", chyba)
vrátit se
}
// Získání aktuálního času v místě
teď := čas. Nyní().In (loc)
fmt. Println("Aktuální čas v New Yorku:", Nyní)
}
The v metoda Nyní funkce vezme místo a vypíše tam čas:
Kromě toho můžete použít FixedZone metoda pro načtení aktuálního času v místě, pokud znáte řetězec umístění a posun časového pásma od UTC. Nejprve budete muset načíst aktuální čas v UTC a poté použijete metodu FixedZone k načtení umístění na základě řetězce a offsetu před předáním umístění do metody času In instance.
import (
"fmt"
"čas"
)funchlavní() {
// Získání aktuálního času v UTC
teď := čas. Nyní().UTC()// Nastavení časového pásma pro Lagos
lagos := teď. Včas. FixedZone("WAT", 3600))
// Vytiskne aktuální čas na obou místech
fmt. Println("Aktuální čas v Lagosu:", Lagos)
}
The hlavní funkce vytiskne na konzoli aktuální čas v Lagosu.
Měření trvání časového pásma
Časový balíček poskytuje Pásmo metoda pro načtení zkratky a offsetu časového pásma spojeného s a čas. Čas hodnota. Metoda Zone vrací řetězec představující zkratku časového pásma (např. „EST“ pro „Amerika/New_York“) a celé číslo představující počet sekund východně od UTC.
import (
"fmt"
"čas"
)funchlavní() {
// Načte umístění časového pásma pro America/New_York
loc, chyba := čas. LoadLocation("Amerika/New_York")-li chyba!= nula {
fmt. Println("Chyba při načítání umístění:", chyba)
vrátit se
}// Získání aktuálního času v UTC a zadané umístění
t1 := čas. Nyní()
t2 := t1.In (loc)// Získání offsetu v sekundách pro každé časové pásmo
//pro časová pásma
_, offset1 := t1.Zone()
_, offset2 := t2.Zone()// Vypočítejte dobu trvání posunu časového pásma
// mezi UTC a Amerikou/New_Yorkem
trvání := offset2 - offset1
fmt. Printf("Doba trvání posunu časového pásma" +
"mezi UTC a New Yorkem je: %d sekund", doba trvání)
}
V hlavní funkci metoda Zone měří dobu trvání posunu časové zóny mezi dvěma časovými zónami (čas. Časové hodnoty). The t1 proměnná je aktuální čas v UTC a t2 proměnná je aktuální čas v časovém pásmu "Amerika/New_York".
Funkce vytiskne doba trvání proměnná (rozdíl v posunu mezi časovými pásmy) představující posun časové zóny v sekundách.
Vyhodnocení času mezi časovými pásmy
Čas mezi časovými pásmy můžete vyhodnotit, pokud znáte dobu trvání mezi časovými pásmy. Můžete použít Přidat metodou In své doby. Instance časové struktury pro přidání trvání k času v časovém pásmu.
import (
"log"
"čas"// import časového balíčku
)funcvyhodnotitČas(čas t. Čas, doba trvání. Doba trvání)čas.Čas {
// načte umístění pro Afriku/Lagos
místo, chyba := čas. LoadLocation("Afrika/Lagos")
-li chyba!= nula {
log. Println("Při načítání polohy došlo k chybě")
}
vrátit se t. V (umístění). Přidat (trvání)
}
The vyhodnotitČas funkce zabere čas. Instance času a trvání typu čas. Doba trvání, vrací čas v časovém pásmu. Načte aktuální čas v „Afrika/Lagos“ a přidá k času trvání.
Manipulujte s časem a datem pomocí časového balíčku
Časový balíček je velmi univerzální pro práci s časy i daty. Časový balíček poskytuje funkce jako Unix() pro převod času na čas Unix, Sleep() pro pozastavení goroutin a Format() pro formátování časových hodnot na řetězec.