CREATE TABLE events ( id SERIAL, local_start TIMESTAMPTZ, -- absolute moment in UTC user_time_zone TEXT -- 'America/Los_Angeles' );

good_time = timezone.now() # includes UTC offset

bad_time = datetime.datetime(2025, 4, 14, 14, 0, 0)

-- Create a test table CREATE TABLE time_test ( ts_native TIMESTAMP, -- without tz ts_tz TIMESTAMPTZ -- with tz );

If a system is physically air-gapped and will never interact with other timezones, TIMESTAMP simplifies the logic by removing the conversion overhead. The Verdict

-- Insert the same "local" value INSERT INTO time_test VALUES ('2025-04-14 14:00:00', '2025-04-14 14:00:00');