No PostgreSQL, você pode usar o
timezone()
função para converter um carimbo de data/hora para outro fuso horário. Sintaxe
A sintaxe fica assim:
timezone(zone, timestamp)
Onde
zone
é o fuso horário que você deseja que o timestamp
argumento a ser convertido. O resultado obtido dependerá se o valor do carimbo de data/hora original inclui um fuso horário ou não (e qual é esse valor).
Exemplo 1 -Quando o carimbo de data/hora original NÃO inclui o fuso horário
Veja o que acontece quando o carimbo de data/hora original inclui o fuso horário.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+00');
Resultado:
2020-10-25 04:00:00
Quando o carimbo de data/hora original inclui o fuso horário, o
timezone()
A função muda o valor do carimbo de data/hora original para o fuso horário especificado e retorna o valor sem fuso horário. Aqui está o que acontece se eu alterar o fuso horário do timestamp de entrada.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+01');
Resultado:
2020-10-25 03:00:00
O timestamp resultante é deslocado de acordo com o fuso horário de entrada.
E se você especificar
timestamp with time zone
, mas o carimbo de data/hora original não inclui um fuso horário, então o valor do carimbo de data/hora original é deslocado para o fuso horário local. SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00');
Resultado:
2020-10-24 18:00:00
Nesse caso, o timestamp resultante foi adiado em seis horas. Isso significa que meu fuso horário local está seis horas à frente do Indian/Maurício.
Podemos ver o deslocamento de fuso horário que foi usado selecionando o valor de entrada diretamente.
SELECT timestamp with time zone '2020-10-25 00:00:00';
Resultado:
2020-10-25 00:00:00+10
Exemplo 2 – Quando o carimbo de data/hora original NÃO inclui o fuso horário
Veja o que acontece quando o carimbo de data/hora original não incluir um fuso horário.
SELECT timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00');
Resultado:
2020-10-25 06:00:00+10
Quando o carimbo de data/hora original não inclui um fuso horário, o resultado é exibido usando o
TimeZone
atual configuração e o deslocamento do fuso horário é anexado. Isso se aplica sempre que você especificar
timestamp without time zone
, mesmo que o carimbo de data/hora contenha de fato um deslocamento de fuso horário. SELECT timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00+12');
Resultado:
2020-10-25 06:00:00+10
Isso é esperado, porque se eu selecionar apenas o
timestamp without time zone
valor, isso é o que eu recebo:SELECT timestamp without time zone '2020-10-25 00:00:00+12';
Resultado:
2020-10-25 00:00:00
Exemplo 3 – carimbo de data/hora local
Vamos usar o
localtimestamp
função para executar uma comparação entre o timestamp atual no meu próprio fuso horário e o timestamp resultante após usar o timezone()
função para convertê-lo para um fuso horário diferente. \x
SELECT
localtimestamp,
timezone('Indian/Mauritius', localtimestamp);
Resultado:
localtimestamp | 2020-07-08 15:42:04.965221 timezone | 2020-07-08 21:42:04.965221+10
O
localtimestamp
função retorna um timestamp tipo de dados, que vem com um implícito “sem fuso horário”. Em outras palavras, carimbo de data e hora e timestamp sem fuso horário são a mesma coisa. Conforme demonstrado anteriormente, quando nenhum fuso horário é especificado no timestamp original, o
TimeZone
atual configuração é usada e anexada ao resultado. E é isso que obtemos ao usar localtimestamp
. A propósito, neste exemplo eu usei
\x
para exibir o resultado usando exibição expandida/saída vertical, apenas para facilitar a leitura. Exemplo 4 – current_timestamp
Agora vamos usar o
current_timestamp
função em vez de localtimestamp
. SELECT
current_timestamp,
timezone('Indian/Mauritius', current_timestamp);
Resultado (usando saída vertical):
current_timestamp | 2020-07-08 15:42:04.335669+10 timezone | 2020-07-08 09:42:04.335669
Desta vez, o deslocamento do fuso horário foi anexado ao carimbo de data e hora original e o
timezone()
resultado não o inclui mais. Obtemos este resultado porque o
current_timestamp
função retorna um timestamp com fuso horário tipo de dados. Exemplo 5 – Usando valores de tempo
O
timezone()
função também funciona com time
valores (time with time zone
e time without time zone
). No entanto, ao usá-lo em
time with time zone
valores, o deslocamento do fuso horário é anexado ao resultado. SELECT
timezone('Indian/Mauritius', time with time zone '00:00:00+00'),
timezone('Indian/Mauritius', time with time zone '00:00:00+01'),
timezone('Indian/Mauritius', time with time zone '00:00:00');
Resultado (usando saída vertical):
timezone | 04:00:00+04 timezone | 03:00:00+04 timezone | 18:00:00+04
E para completar, aqui estão esses mesmos valores usando um
time without time zone
tipo de dados. SELECT
timezone('Indian/Mauritius', time without time zone '00:00:00+00'),
timezone('Indian/Mauritius', time without time zone '00:00:00+01'),
timezone('Indian/Mauritius', time without time zone '00:00:00');
Resultado (usando saída vertical):
timezone | 18:00:00+04 timezone | 18:00:00+04 timezone | 18:00:00+04
Verifique o fuso horário local
Se você quiser verificar seu próprio fuso horário local, execute
SHOW TIMEZONE
. Aqui está o que recebo quando executo esse comando.
SHOW TIMEZONE;
Resultado:
Australia/Brisbane
Verifique o deslocamento do fuso horário
Armado com o conhecimento acima, agora posso verificar os dois deslocamentos de fuso horário consultando o
pg_timezone_names
visualizar. SELECT *
FROM pg_timezone_names
WHERE name = 'Indian/Mauritius'
OR name = 'Australia/Brisbane';
Resultado (usando saída vertical):
name | abbrev | utc_offset | is_dst --------------------+--------+------------+-------- Indian/Mauritius | +04 | 04:00:00 | f Australia/Brisbane | AEST | 10:00:00 | f
Consulte Retornar uma lista de fusos horários suportados pelo PostgreSQL para obter mais opções e exemplos de como retornar o fuso horário no Postgres.