now () возвращает временную метку с часовым поясом.Информация о часовом поясе будет удалена, когда она приведена к временной метке без часового пояса, когда она сохранена в вашей таблице, но фактическое значение, сохраненное в ней, будет зависеть от часового пояса сеанса.
Вы можете довольно легко увидеть это поведение:
postgres=# begin;
BEGIN
postgres=# set time zone utc;
SET
postgres=# insert into test select now();
INSERT 0 1
postgres=# set time zone 'US/Eastern';
SET
postgres=# insert into test select now();
INSERT 0 1
postgres=# select * from test;
a
----------------------------
2019-06-06 12:46:10.475424
2019-06-06 08:46:10.475424
(2 rows)
Немного больше объяснений после вашего комментария.Я думаю, что проблема, с которой вы сталкиваетесь, заключается в преобразовании между меткой времени и меткой времени.Временные метки гораздо менее запутанны, если вы используете только метку времени.Давайте удалим now () из обсуждения, так как это добавляет дополнительный уровень сложности, потому что преобразование из результата now () во временную метку без часового пояса зависит от часового пояса сеанса.
select '2019-06-06 12:00:00UTC'::timestamp with time zone,
('2019-06-06 12:00:00UTC'::timestamp with time zone) at time zone 'Asia/Kolkata';
timestamptz | timezone
------------------------+---------------------
2019-06-06 12:00:00+00 | 2019-06-06 17:30:00
Я считаю,это то, что вы ожидаете?Мы конвертируем метку времени с часовым поясом в метку времени без часового пояса в конкретном часовом поясе.
То, что вы делаете, похоже на это:
select '2019-06-06 12:00:00UTC'::timestamp with time zone,
(('2019-06-06 12:00:00UTC'::timestamp with time zone)::timestamp without time zone) at time zone 'Asia/Kolkata';
timestamptz | timezone
------------------------+------------------------
2019-06-06 12:00:00+00 | 2019-06-06 06:30:00+00
(1 row)
Я думаю, вы найдете это гораздо менее запутанным, если вы можете хранить метку времени с часовым поясом вместо метки времени без часового пояса.