Conversions between timestamp without time zone and timestamp with time zone normally assume that the timestamp without time zone value should be taken or given as timezone local time. A different time zone can be specified for the conversion using AT TIME ZONE.
With this in mind, the following output is troublesome:
vendita=# select now()::timestamp(0), now()::timestamp(0) with time zone, timezone('utc', now()::timestamp(0)), timezone('utc', now()::timestamp(0) with time zone); now | now | timezone | timezone ---------------------+------------------------+------------------------+--------------------- 2017-05-18 08:55:10 | 2017-05-18 08:55:10-07 | 2017-05-18 01:55:10-07 | 2017-05-18 15:55:10 (1 row)
vendita=# show timezone; TimeZone ------------ US/Arizona (1 row)
The computation where the assumed use of the local time zone should occur is incorrect (the third column).
Looks fine to me. What should the answer in your opinion be, and why?