The sensible established approach when saving times or timestamps is always to save such values as UTC (which approximately the same as GMT), and then to convert into the timezone of the user when being used for business logic or where this is otherwise required.
Thankfully, Postgres offers functionality which can avoid any issues with timezones.
Postgres offers a timezone-aware type
TIMESTAMP WITH TIME ZONE or
TIMESTAMPTZ to make getting UTC values into the database easier — simply include the timezone in the string.
By way of example—this is a
SELECT but the same syntax would be used with an
SELECT '2022-04-15 08:30:00 Europe/London'::timestamptz
When pulling data out of the database which has a
TIMESTAMPTZ column, you can specify using
AT TIME ZONE what timezone you would like the timestamps in.
By way of example:
SELECT ts AT TIME ZONE 'Europe/London' as ts_london
ORDER BY ts DESC;
Note because the
TIMESTAMPTZ only stores the timestamp in UTC and not the timezone, it may be worth storing the timezone in another column for reference.