Le propre le moyen n'est pas d'utiliser time with time zone
(notez l'espace entre time
et zone
) du tout, car il est cassé par conception. C'est dans le standard SQL, donc Postgres prend en charge le type - mais conseille pas pour l'utiliser. Plus dans cette réponse connexe :
Puisque vous rencontrez des problèmes avec DST
, timetz
(nom abrégé) est un choix particulièrement mauvais. Il est mal équipé pour faire face à l'heure d'été. Il est impossible de dire si 8:00:00
est en heure d'hiver ou d'été.
Utilisez timestamp with time zone
(timstamptz
)
Au lieu. Vous pouvez toujours supprimer la partie date. Utilisez simplement start_time::time
pour obtenir le local heure à partir d'un timestamptz
. Ou utilisez AT TIME ZONE
à transposer dans votre fuseau horaire.
Généralement, pour prendre en compte automatiquement l'heure d'été , utilisez un nom de fuseau horaire au lieu d'une abréviation de fuseau horaire. Plus d'explications dans cette question et réponse :
Dans votre cas particulier, vous pourriez probablement utiliser America/Los_Angeles
(exemple avec timestamptz
):
INSERT INTO mytable(start_time, end_time)
VALUES
('1970-01-01 08:00:00 America/Los_Angeles'
, '1970-01-01 18:00:00 America/Los_Angeles')
J'ai trouvé ceci en vérifiant :
SELECT * FROM pg_timezone_names
WHERE utc_offset = '-07:00'
AND is_dst;
Notions de base sur la gestion des fuseaux horaires :