O carimbo de data/hora do Unix é o número de segundos desde a meia-noite UTC de 1º de janeiro de 1970.
Como obtenho o timestamp unix correto do PostgreSQL?
Ao comparar com currenttimestamp.com e timestamp.1e5b.de , não recebo o tempo esperado do PostgreSQL:
Isso retorna o timestamp correto:
SELECT extract(epoch from now());
Enquanto isso não:
SELECT extract(epoch from now() at time zone 'utc');
Eu moro no fuso horário UTC +02. Qual é a maneira correta de obter o timestamp unix atual do PostgreSQL?
Isso retorna a hora e o fuso horário corretos:
SELECT now();
now
-------------------------------
2011-05-18 10:34:10.820464+02
Outra comparação:
select now(),
extract(epoch from now()),
extract(epoch from now() at time zone 'utc');
now | date_part | date_part
-------------------------------+------------------+------------------
2011-05-18 10:38:16.439332+02 | 1305707896.43933 | 1305700696.43933
(1 row)
Unix timestamp from the web sites:
1305707967
No postgres,
timestamp with time zone
pode ser abreviado comotimestamptz
, etimestamp without time zone
comotimestamp
. Usarei os nomes de tipo mais curtos para simplificar.Obter o timestamp Unix de um postgres
timestamptz
comonow()
é simples, como você diz, apenas:Isso é realmente tudo o que você precisa saber sobre como obter o tempo absoluto de qualquer coisa do tipo
timestamptz
, incluindonow()
.As coisas só ficam complicadas quando você tem um
timestamp
campo.Quando você coloca
timestamptz
dados comonow()
nesse campo, primeiro eles são convertidos para um fuso horário específico (explicitamente comat time zone
ou convertendo para o fuso horário da sessão) e as informações do fuso horário são descartadas . Já não se refere a um tempo absoluto. É por isso que você geralmente não deseja armazenar carimbos de data e hora comotimestamp
e normalmente usariatimestamptz
- talvez um filme seja lançado às 18h em uma data específica em cada fuso horário , esse é o tipo de caso de uso.Se você trabalhar apenas em um único fuso horário, poderá se safar (mau) usando
timestamp
. A conversão de volta paratimestamptz
é inteligente o suficiente para lidar com o horário de verão, e os timestamps são considerados, para fins de conversão, no fuso horário atual. Aqui está um exemplo para GMT/BST:DBFiddle
Mas, observe o seguinte comportamento confuso:
DBFiddle
Isto porque :
não retorna o carimbo de data/hora correto porque a conversão de fuso horário postgres descarta as informações de fuso horário do resultado:
depois, extract examina o timestamp sem fuso horário e considera que é uma hora local (embora já seja utc de fato).
A forma correta seria:
Na última linha o primeiro
at time zone
realiza a conversão, o segundo atribui um novo fuso horário ao resultado.