Допустим, у меня есть следующее:
- Таблица в базе данных 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