In sostanza ciò che si vuole è:
$ select starts_at AT TIME ZONE 'UTC' AT TIME ZONE 'US/Pacific' from schedules where id = 40
ho avuto la soluzione da questo articolo è al di sotto, che è ORO dritto !!! Spiega questo problema non banale molto chiaramente, dargli una lettura se desideri comprendere meglio la gestione di TST pstgrsql.
Expressing PostgreSQL timestamps without zones in local time
Ecco che cosa sta succedendo. Per prima cosa dovresti sapere che "il fuso orario PST è di 8 ore rispetto al fuso orario UTC, quindi ad esempio 1 gen 2014, 16:30 PST (mer, 01 gen 2014 16:00:30 -0800) equivale al 2 gen 2014, 00:30 AM UTC (Gio, 02 gen 2014 00:00:30 +0000). In qualsiasi momento dopo le 16:00 nel PST si passa al giorno successivo, interpretato come UTC.
Inoltre, come menzionato sopra Erwin Brandstetter, postresql ha due tipi di dati di tipo data/ora, uno con un fuso orario e uno senza. Se i timestamp include un fuso orario, poi un semplice:
$ select starts_at AT TIME ZONE 'US/Pacific' from schedules where id = 40
funzionerà. Tuttavia se il tuo timestamp è timezoneless, l'esecuzione del comando precedente non funzionerà, e devi IN PRIMO LUOGO convertire il timestamp timezoneless in un timestamp con un fuso orario, cioè un fuso orario UTC, e SOLO ALLORA convertirlo nel PST desiderato o in US/Pacific '(che sono gli stessi per alcuni problemi di ora legale. Penso che dovresti stare bene con entrambi).
Consentitemi di dimostrare con un esempio in cui creo un timestamp timezoneless. Supponiamo per comodità che il nostro fuso orario locale sia effettivamente 'PST' (se non lo fosse, diventa un po 'più complicato che non è necessario ai fini di questa spiegazione).
Dire che ho:
$ select timestamp '2014-01-2 00:30:00' AS a, timestamp '2014-01-2 00:30:00' AT TIME ZONE 'UTC' AS b, timestamp '2014-01-2 00:30:00' AT TIME ZONE 'UTC' AT TIME ZONE 'PST' AS c, timestamp '2014-01-2 00:30:00' AT TIME ZONE 'PST' AS d
Questo produrrà:
"a"=>"2014-01-02 00:30:00" (This is the timezoneless timestamp)
"b"=>"2014-01-02 00:30:00+00" (This is the UTC TZ timestamp, note that up to a timezone, it is equivalent to the timezoneless one)
"c"=>"2014-01-01 16:30:00" (This is the correct 'PST' TZ conversion of the UTC timezone, if you read the documentation postgresql will not print the actual TZ for this conversion)
"d"=>"2014-01-02 08:30:00+00"
L'ultimo timestamp è la ragione di tutto la confusione per quanto riguarda la conversione timezoneless timestamp dal UTC a 'PST' in PostgreSQL. Quando scriviamo:
timestamp '2014-01-2 00:30:00' AT TIME ZONE 'PST' AS d
stiamo facendo un timestamp timezoneless e cercare di convertirlo in 'PST TZ (abbiamo indirettamente supporre che PostgreSQL capirà che vogliamo convertire il timestamp da un'UTC TZ, ma PostreSQL ha piani a sé!). In pratica, ciò che postgresql fa è che prende il timestamp timezoneless ('2014-01-2 00:30:00) e lo tratta come se fosse GIÀ un timestamp' PST 'TZ (es .: 2014-01-2 00:30 : 00 -0800) e lo converte in fuso orario UTC !!! Quindi in realtà lo spinge 8 ore prima anziché indietro! Così otteniamo (2014-01-02 08: 30: 00 + 00).
In ogni caso, questo ultimo (non intuitivo) comportamento è la causa di ogni confusione. Leggi l'articolo se vuoi una spiegazione più approfondita, in realtà ho ottenuto risultati un po 'diversi da quelli relativi a quest'ultima parte, ma l'idea generale è la stessa.
Questo è un po 'corretto -' PST 'non tiene conto dell'ora legale, vedere la risposta di John Rennpferd sull'uso di "US/Pacific" vs "PST" o "PDT" –