Turn postgres date representation into ISO 8601 string
Solution 1:
I think I found a way to do the formatting, but it's not ideal because I'm writing the formatting myself.
Here is a potential solution:
SELECT to_char (now()::timestamp at time zone 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS"Z"')
Solution 2:
This is a terse way to "turn a PostgreSQL date representation into an ISO 8601 string":
SELECT to_json(now())#>>'{}'
It uses the #>>
operator in combination with the to_json()
function, which can both be found on this page:
https://www.postgresql.org/docs/current/functions-json.html
The operator "Get[s] JSON object at specified path as text". However when you specify an empty array literal '{}'
as the path, it specifies the root object.
Compare this method to similar methods:
SELECT
to_char(now(), 'YYYY-MM-DD"T"HH24:MI:SSOF') AS most_lengthy, -- See note: *
trim(both '"' from to_json(now())::text) AS a_bit_lengthy,
to_json(now())::text AS unwanted_quotes,
to_json(now())#>>'{}' AS just_right
It's shorter but produces the same results.
* Also, JavaScript will not parse the first method's output via the Date()
constructor, because it expects a simplification of the ISO 8601 which only accepts time zones in (+/-)HH:mm or Z format, but OF
returns (+/-)HH format without the minutes, UNLESS the input timezone is a fraction of an hour, e.g. using SET timezone=-4.5;
at the beginning of the session. Alternatively you could manually append your timezone as a string to the lengthy version and exclude the OF
Solution 3:
Maybe for someone it would be helpful to know that since Postgres 9.4 to_json
function (as well as row_to_json
) also converts timestamp to a proper ISO 8601 format but in addition it wraps a value in quotes which might not be desirable:
SELECT now();
2017-05-10 15:57:23.736054+03
SELECT to_json(now());
"2017-05-10T15:57:23.769561+03:00"
-- in case you want to trim the quotes
SELECT trim(both '"' from to_json(now())::text);
2017-05-10T15:57:23.806563+03:00