W PostgreSQL możesz użyć timezone()
funkcja konwersji znacznika czasu na inną strefę czasową.
Składnia
Składnia wygląda tak:
timezone(zone, timestamp)
Gdzie zone
jest strefą czasową, w której chcesz umieścić timestamp
argument, na który ma zostać przekonwertowany.
Otrzymany wynik będzie zależał od tego, czy oryginalna wartość znacznika czasu zawiera strefę czasową, czy nie (i jaka jest ta wartość).
Przykład 1 – kiedy oryginalny znacznik czasu zawiera strefę czasową
Oto, co się dzieje, gdy oryginalny znacznik czasu zawiera strefę czasową.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+00');
Wynik:
2020-10-25 04:00:00
Gdy oryginalny znacznik czasu zawiera strefę czasową, timezone()
funkcja przesuwa oryginalną wartość znacznika czasu do określonej strefy czasowej i zwraca wartość bez strefy czasowej.
Oto, co się stanie, jeśli zmienię strefę czasową znacznika czasu wejściowego.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+01');
Wynik:
2020-10-25 03:00:00
Wynikowy znacznik czasu jest przesuwany zgodnie z wprowadzoną strefą czasową.
A jeśli określisz timestamp with time zone
, ale oryginalny znacznik czasu w rzeczywistości nie zawiera strefy czasowej, wówczas oryginalna wartość znacznika czasu jest przenoszona do lokalnej strefy czasowej.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00');
Wynik:
2020-10-24 18:00:00
W tym przypadku uzyskany znacznik czasu został cofnięty o sześć godzin. Oznacza to, że moja lokalna strefa czasowa jest o sześć godzin przed Indian/Mauritius.
Możemy zobaczyć przesunięcie strefy czasowej, które zostało użyte, wybierając bezpośrednio wartość wejściową.
SELECT timestamp with time zone '2020-10-25 00:00:00';
Wynik:
2020-10-25 00:00:00+10
Przykład 2 – Kiedy oryginalny znacznik czasu NIE zawiera strefy czasowej
Oto, co się dzieje, gdy oryginalny znacznik czasu nie zawierać strefę czasową.
SELECT timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00');
Wynik:
2020-10-25 06:00:00+10
Gdy oryginalny znacznik czasu nie zawiera strefy czasowej, wynik jest wyświetlany przy użyciu bieżącej TimeZone
ustawienie i dołączane jest przesunięcie strefy czasowej.
Ma to zastosowanie za każdym razem, gdy określisz timestamp without time zone
, nawet jeśli znacznik czasu faktycznie zawiera przesunięcie strefy czasowej.
SELECT timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00+12');
Wynik:
2020-10-25 06:00:00+10
Należy się tego spodziewać, ponieważ jeśli wybiorę tylko timestamp without time zone
wartość, oto co otrzymuję:
SELECT timestamp without time zone '2020-10-25 00:00:00+12';
Wynik:
2020-10-25 00:00:00
Przykład 3 – lokalny znacznik czasu
Użyjmy localtimestamp
funkcja do uruchomienia porównania między bieżącym znacznikiem czasu w mojej własnej strefie czasowej a wynikowym znacznikiem czasu po użyciu timezone()
funkcji, aby przekonwertować go na inną strefę czasową.
\x
SELECT
localtimestamp,
timezone('Indian/Mauritius', localtimestamp);
Wynik:
lokalny znacznik czasu | 2020-07-08 15:42:04.965221strefa czasowa | 2020-07-08 21:42:04.965221+10
localtimestamp
funkcja zwraca sygnaturę czasową typ danych, który pochodzi z niejawnym „bez strefy czasowej”. Innymi słowy, sygnatura czasowa i sygnatura czasowa bez strefy czasowej są tym samym.
Jak pokazano wcześniej, gdy w oryginalnym znaczniku czasu nie określono strefy czasowej, bieżąca TimeZone
ustawienie jest używane i dołączane do wyniku. I to właśnie otrzymujemy, używając localtimestamp
.
Przy okazji, w tym przykładzie użyłem \x
aby wyświetlić wynik za pomocą rozszerzonego wyświetlania/wyjścia pionowego, aby ułatwić czytanie.
Przykład 4 – aktualny_sygnatura czasowa
Teraz użyjmy current_timestamp
funkcja zamiast localtimestamp
.
SELECT
current_timestamp,
timezone('Indian/Mauritius', current_timestamp);
Wynik (przy użyciu wyjścia pionowego):
bieżąca_sygnatura czasowa | 2020-07-08 15:42:04.335669+10strefa czasowa | 2020-07-08 09:42:04.335669
Tym razem przesunięcie strefy czasowej zostało dołączone do oryginalnego znacznika czasu, a timezone()
wynik już go nie zawiera.
Otrzymujemy ten wynik, ponieważ current_timestamp
funkcja zwraca znacznik czasu ze strefą czasową typ danych.
Przykład 5 – Korzystanie z wartości czasu
timezone()
funkcja działa również z time
wartości (time with time zone
i time without time zone
).
Jednak gdy używasz go w time with time zone
wartości, przesunięcie strefy czasowej jest dodawane do wyniku.
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');
Wynik (przy użyciu wyjścia pionowego):
A dla kompletności, oto te same wartości przy użyciu time without time zone
typ danych.
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');
Wynik (przy użyciu wyjścia pionowego):
Sprawdź lokalną strefę czasową
Jeśli chcesz sprawdzić swoją lokalną strefę czasową, uruchom SHOW TIMEZONE
.
Oto, co otrzymuję po uruchomieniu tego polecenia.
SHOW TIMEZONE;
Wynik:
Australia/Brisbane
Sprawdź przesunięcie strefy czasowej
Uzbrojony w powyższą wiedzę, mogę teraz sprawdzić dwa przesunięcia stref czasowych, wysyłając zapytanie do pg_timezone_names
widok.
SELECT *
FROM pg_timezone_names
WHERE name = 'Indian/Mauritius'
OR name = 'Australia/Brisbane';
Wynik (przy użyciu wyjścia pionowego):
nazwa | skrót | utc_offset | is_dst---------+---------+------------+------ --Indyjski/Mauritius | +04 | 04:00:00 | fAustralia/Brisbane | AEST | 10:00:00 | f
Zobacz Zwracanie listy stref czasowych obsługiwanych przez PostgreSQL, aby uzyskać więcej opcji i przykładów zwracania strefy czasowej w Postgresie.