Добавить информацию о часовом поясе к существующему времени - PullRequest
2 голосов
/ 01 ноября 2019

Допустим, у меня есть следующее:

  • Таблица в базе данных Postgres со столбцом TIMESTAMP.
  • В качестве часового пояса базы данных установлено значение, отличное от UTC.
  • Некоторые операторы SQL, которые вставляют значения меток времени с CURRENT_TIMESTAMP или NOW()

Как указано вДокументация Postgres:

Функция CURRENT_TIMESTAMP () возвращает TIMESTAMP WITH ZONE TIME, которая представляет дату и время, когда транзакция началась.

Поэтому следующий оператор выполняется без вывода сообщенийпреобразование локальной временной метки в абсолютную временную метку:

INSERT INTO foo (id, timestamp_column) VALUES (0, CURRENT_TIMESTAMP);


Предположим, что программа Go считывает эти данные в time.Time объект, этот объект будет иметь пустой Location:

fmt.Println(timeFromDb.Location().String() == "") // true

, который интерпретируется как UTC. На данный момент я знаю, что время перехода timeFromDb на самом деле не является UTC, и я также знаю, что такое настройка часового пояса базы данных.

Как я могу установить правильный часовой пояс для этого объекта времени , не интерпретируя его ? Так что:

fmt.Println(timeFromDb) // 2009-11-10 10:00:00
fmt.Println(timeFromDb.Location()) // <empty>
fmt.Println(timeFromDb.UTC()) // 2009-11-10 10:00:00
// magic?
fmt.Println(timeFromDb) // 2009-11-10 10:00:00
fmt.Println(timeFromDb.Location()) // America/Vancouver
fmt.Println(timeFromDb.UTC()) // 2009-11-10 18:00:00

1 Ответ

1 голос
/ 01 ноября 2019

Вы можете переосмыслить это:

loc,_:=time.LoadLocation("America/Vancouver")
t2:=timeFromDb.In(loc)
_,off:=t2.Zone()
theTime:=t2.Add(-time.Duration(off)*time.Second)

Вы также можете выполнить некоторые манипуляции со строками, но я подозреваю, что это быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...