activerecord-jdbc-adapter
activerecord-jdbc-adapter copied to clipboard
Time zone offset being subtracted from utc timestamp when inserting into column while using prepared statements
rails 6.1.4.1
activerecord-jdbcpostgresql-adapter (61.1-java)
activerecord-jdbc-adapter (61.1-java)
jdbc-postgres (42.2.14)
jruby 9.2.19.0
on openjdk8
application.rb
config.time_zone = "UTC"
Table "public.foobars"
Column | Type | Collation | Nullable | Default
--------------------------------------------------------+-----------------------------+-----------+----------+--------------------------------------------------
id | integer | | not null | nextval('foobars_id_seq'::regclass)
created_at | timestamp without time zone | | |
updated_at | timestamp without time zone | | |
When prepared statements are turned on and a record is inserted into the database, the active record debug log shows the correct UTC timestamp with an offset of +00:00
.
[DEBUG] [2021-10-08 13:13:20 -0600] Foobar Create (31.2ms) INSERT INTO "foobars" ("created_at", "updated_at") VALUES (?, ?) [["created_at", Fri, 08 Oct 2021 19:13:20.573182000 UTC +00:00], ["updated_at", Fri, 08 Oct 2021 19:13:20.573363000 UTC +00:00], ]
However the inserted record takes my current offset (MDT -6:00
) and applies it to the record, saving the incorrect time.
app_development=# select * from foobars;
-[ RECORD 1 ]------------------------------------------+-----------------------------------------
created_at | 2021-10-08 13:13:14.411114
updated_at | 2021-10-08 13:13:14.411256
Turning off prepared statements solves this problem.
Looking into this more, the current timezone in my postgres instance is America/Denver
. But once again, MRI does not have this issue using the pg
adapter but JRuby does.
psql (13.4)
Type "help" for help.
testdb=# show timezone;
TimeZone
----------------
America/Denver
(1 row)
I suspect this isn't a commonly run into issue, because most if not all production databases would be running on a host in UTC time and postgres set to UTC.
Maybe not common, but does happen. We have been hit. It results in a big mess :(