Dalam postgres, timestamp with time zonedapat disingkat sebagai timestamptz, dan timestamp without time zonesebagai timestamp. Saya akan menggunakan nama jenis yang lebih pendek untuk kesederhanaan.
Mendapatkan cap waktu Unix dari postgres timestamptzlike now()itu sederhana, seperti yang Anda katakan, cukup:
select extract(epoch from now());
Itu benar-benar semua yang perlu Anda ketahui tentang mendapatkan waktu absolut dari jenis apa pun timestamptz, termasuk now().
Hal-hal hanya menjadi rumit ketika Anda memiliki timestampbidang.
Ketika Anda memasukkan timestamptzdata seperti itu now()ke bidang itu, pertama-tama data itu akan dikonversi ke zona waktu tertentu (baik secara eksplisit dengan at time zoneatau dengan mengonversi ke zona waktu sesi) dan informasi zona waktu dibuang . Itu tidak lagi mengacu pada waktu absolut. Inilah sebabnya mengapa Anda biasanya tidak ingin menyimpan cap waktu seperti timestampdan biasanya menggunakan timestamptz- mungkin sebuah film dirilis pada pukul 6 sore pada tanggal tertentu di setiap zona waktu , itulah jenis kasus penggunaan.
Jika Anda hanya pernah bekerja di zona waktu tunggal, Anda mungkin lolos dengan (mis) menggunakan timestamp. Konversi kembali ke timestamptzcukup pintar untuk mengatasi DST, dan cap waktu dianggap, untuk tujuan konversi, berada di zona waktu saat ini. Berikut ini contoh untuk GMT / BST:
select '2011-03-27 00:59:00.0+00'::timestamptz::timestamp::timestamptz
, '2011-03-27 01:00:00.0+00'::timestamptz::timestamp::timestamptz;
/*
|timestamptz |timestamptz |
|:---------------------|:---------------------|
|2011-03-27 00:59:00+00|2011-03-27 02:00:00+01|
*/
DBFiddle
Tapi, perhatikan perilaku membingungkan berikut:
set timezone to 0;
values(1, '1970-01-01 00:00:00+00'::timestamp::timestamptz)
, (2, '1970-01-01 00:00:00+02'::timestamp::timestamptz);
/*
|column1|column2 |
|------:|:---------------------|
| 1|1970-01-01 00:00:00+00|
| 2|1970-01-01 00:00:00+00|
*/
DBFiddle
Ini karena :
PostgreSQL tidak pernah memeriksa konten string literal sebelum menentukan jenisnya, dan karenanya akan memperlakukan keduanya [...] sebagai timestamp tanpa zona waktu. Untuk memastikan literal diperlakukan sebagai timestamp dengan zona waktu, berikan tipe eksplisit yang benar ... Dalam literal yang telah ditentukan sebagai timestamp tanpa zona waktu, PostgreSQL diam-diam akan mengabaikan indikasi zona waktu apa pun