Go Time Package: Zaman Dilimi ve Parsing Sorunlarını Çözmek

Go'da zaman işlemek ilk bakışta basit görünse de, zaman dilimleri ve tarih formatları sık sık sorun çıkarır. Time paketinin Location ve Layout mekanizması doğru anlaşılmazsa, UTC'ye dönüşüm yanlış olur ya da parsing başarısız kalır.

Go'da time.Time her zaman UTC içinde saklanır, ancak ekranda göstermek ya da dış kaynaktan okumak istediğinde zaman dilimi uyuşmazlığı oluşur. Ayrıca tarih stringini parse ederken format (layout) hatasıyla saat boş kalabilir.

Bir zamanı başka bir zaman dilimine dönüştürmek için önce Location yükle, sonra In() metodunu kullan.

1package main
2
3import (
4"fmt"
5"time"
6)
7
8func main() {
9// UTC'de şu anki zaman
10utc:= time.Now().UTC()
11fmt.Println("UTC:", utc)
12
13// Istanbul zaman dilimini yükle
14loc, err:= time.LoadLocation("Europe/Istanbul")
15if err!= nil {
16panic(err)
17}
18
19// Aynı zamanı Istanbul diliminde göster
20istanbul:= utc.In(loc)
21fmt.Println("Istanbul:", istanbul)
22}

Çıktı:

1UTC: 2024-01-15 14:30:00 +0000 UTC
2Istanbul: 2024-01-15 17:30:00 +0300 EET

Parse ederken layout eksikse ya da yanlışsa saat kısmı atlanır. Go'da layout sabittir; örnek bir zamanı kullanarak formatı tanımlarsın.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1package main
2
3import (
4"fmt"
5"time"
6)
7
8func main() {
9// Yanlış: layout eksik
10str:= "2024-01-15 14:30:00"
11t, _:= time.Parse("2006-01-02", str) // Sadece tarih
12fmt.Println("Hatalı parse:", t) // Saat 00:00:00 olur
13
14// Doğru: tam layout
15t2, _:= time.Parse("2006-01-02 15:04:05", str)
16fmt.Println("Doğru parse:", t2)
17}

Çıktı:

1Hatalı parse: 2024-01-15 00:00:00 +0000 UTC
2Doğru parse: 2024-01-15 14:30:00 +0000 UTC

Eğer stringde zaman dilimi bilgisi varsa ve onu korumak istiyorsan, ParseInLocation() kullan.

1package main
2
3import (
4"fmt"
5"time"
6)
7
8func main() {
9str:= "2024-01-15 14:30:00"
10loc, _:= time.LoadLocation("Europe/Istanbul")
11
12// Parse et, ancak sonucu Istanbul diliminde tut
13t, _:= time.ParseInLocation("2006-01-02 15:04:05", str, loc)
14fmt.Println("Istanbul saati:", t)
15fmt.Println("UTC karşılığı:", t.UTC())
16}

Çıktı:

1Istanbul saati: 2024-01-15 14:30:00 +0300 EET
2UTC karşılığı: 2024-01-15 11:30:00 +0000 UTC

Veritabanında her zaman UTC sakla, uygulamada UTC ile çalış. Ekran gösterimi ya da API yanıtında kullanıcının zaman dilimine dönüştür. Layout tanımlarken Go'nun sabit örneğini (Mon Jan 2 15:04:05 MST 2006) ezberle; bu sıra değişmez.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz