2017-08-28 1 views
0

Ich habe eine postgresql db mit den Spalten date und repeat_until als Zeitstempel mit Zeitzone. Die Beispieldaten haben ein zeitzonenspezifisches Format. Letzteres ist Winterzeit.Zeitzone Informationen aus Postgresql Zeitstempel in go behalten

2017-08-28 09:00:00+02, 2017-12-31 23:00:00+01

Mit Schnur und time.time die erste gibt die Zeit in Bezug auf GMT + 0, den letzten Sekunden (nicht Unix-Zeitstempel).

import (
    _ "github.com/lib/pq" 
    "fmt" 
    "github.com/gorilla/mux" 
    "github.com/jmoiron/sqlx" 
    "log" 
    "net/http" 
    "time" 
) 

type Event struct { 
    Date   string 
    RepeatUntil  time.Time `db:"repeat_until"` 
} 


event := Event{} 
rows, _ := db.Queryx("select * from events order by date") 
for rows.Next() { 
    err := rows.StructScan(&event) 
    if err != nil { 
     log.Fatalln(err) 
    } 
    fmt.Printf("%#v", event) 
} 

Date:"2017-08-28T07:00:00Z"

RepeatUntil:time.Time{sec:63650354400, nsec:0, loc:(*time.Location)(nil)}

Was ist der empfohlene Weg, Zeitzoneninformationen zu behalten? time.Time scheint offensichtlich, aber ich bin mir nicht sicher, wie es zu den Sekunden gekommen ist, die im Jahr 3986 in unixtime ist.

Ich benutze sqlx.

+0

erhalten werden, was das Problem ist. Es behält die Zeitzone. https://play.golang.org/p/Lj_uxCts1R. Oh warte ... Ich sehe, dein Problem ist, wie 'sqlx' es analysiert. – RayfenWindspear

+0

Haben Sie versucht, 'string' in Ihrer Struktur anstelle von' time.Time' zu ​​verwenden und diese dann selbst mit dem Layout zu analysieren, wie in meinem Spielplatz Link? – RayfenWindspear

+0

Ich beginne mich wirklich zu fragen, ob Sie eine alte Version des 'pq' Treibers haben und ein Update benötigen. Nach dem Code, den ich durchgesehen habe und den Testfällen, die ich gesehen habe (https://github.com/lib/pq/blob/e42267488fe361b9dc034be7a6bffef5b195bceb/encode_test.go#L191), sollte es kein Problem haben, Zeitzonen richtig zu behandeln. Ich schlage vor, dass Sie 'go get -u github.com/lib/pq' laufen lassen. – RayfenWindspear

Antwort

1

Die Zeitzone in PostgreSQL ist ein Sitzungsparameter, d. H. Sie kann für jede Sitzung (Verbindung) angegeben werden. Wenn Sie es nicht angeben, wird die Zeitzone aus den Parametern in pg_hba.conf abgeleitet. Wenn Sie Datensätze auswählen, werden die Datums-/Uhrzeitdaten automatisch von Datenbankzeitzone in Sitzungszeitzone (Verbindung) konvertiert.

In Ihrem Fall, um die Zeit in einer bestimmten Zeitzone zu erhalten, geben Sie dies explizit in den Verbindungsparameter, z.

psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+ 
    "dbname=%s sslmode=disable TimeZone=Europe/Paris", 
    host, port, user, dbname) 
db, err := sqlx.Open("postgres", psqlInfo) 

Die TimeZone kann ich nicht sehen, von

select * from pg_timezone_names; 
0

Die Zeitzone kann während einer einzelnen Verbindung oder durch altering die Einstellung der Zeitzone in der Datenbank konfiguriert werden.

alter database foo set timezone to 'Europe/Oslo';

Dies wird das Datum für diese Zeitzone formatiert zurück.

Verwandte Themen