Mengapa zona waktu memiliki offset-dari-UTC gila pada tahun 0001 di Postgres?

16

Di Postgres 9.5, saya terkejut melihat hasil yang terlihat di bawah saat bereksperimen dengan tahun 0001(tidak ada tahun nol 0000).

Mengimbangi -07:52:58?

Beberapa contoh kode. Perhatikan bahwa saya mencampur penggunaan TIMESTAMP WITH TIME ZONEdan TIMESTAMP WITHOUT TIME ZONE, jadi baca dengan cermat.

SET TIME ZONE 'America/Los_Angeles' ;

SELECT (TIMESTAMP WITH TIME ZONE '2015-01-01 00:00:00.0', 
        TIMESTAMP WITH TIME ZONE '0001-01-01 00:00:00.0Z', 
        TIMESTAMP WITHOUT TIME ZONE '0001-01-01 00:00:00.0Z') ;

("2015-01-01 00:00:00-08","0001-12-31 16:07:02-07:52:58 BC","0001-01-01 00:00:00")

Saya terkejut oleh yang nilai kedua: 0001-12-31 16:07:02-07:52:58 BC. Saya mengerti bahwa kita harus mundur delapan jam sebagaimana America/Los_Angelesdelapan jam di belakang UTC dengan offset -08:00. Tapi bukannya -08:00offset itu -07:52:58. Mengapa?

Tidak Ada Masalah Di Bawah UTC

Tidak ada masalah seperti itu saat memasukkan data di bawah UTC.

SET TIME ZONE 'UTC' ;

SELECT (TIMESTAMP WITH TIME ZONE '2015-01-01 00:00:00.0',  
        TIMESTAMP WITH TIME ZONE '0001-01-01 00:00:00.0Z', 
        TIMESTAMP WITHOUT TIME ZONE '0001-01-01 00:00:00.0Z');

("2015-01-01 00:00:00+00","0001-01-01 00:00:00+00","0001-01-01 00:00:00")

Tanpa Tahun Nol

Ngomong-ngomong, porsi tanggal tampaknya benar. Tampaknya tidak ada tahun 0000, yang menjadi titik pivot antara era “BC” dan “AD”. Ambil momen pertama tahun 0001, kurangi satu jam, dan Anda mendapatkan tahun 0001 BC- jadi tidak ada tahun nol.

SET TIME ZONE 'UTC' ;

INSERT INTO moment_  -- TIMESTAMP WITH TIME ZONE.
VALUES ( TIMESTAMP '0001-01-01 00:00:00.0Z' - INTERVAL '1 hour' ) ;

SET TIME ZONE 'UTC' ;

TABLE moment_ ;

Hasilnya adalah tahun 0001 BC, jadi kami beralih dari 0001ke 0001 BC; tidak ada tahun nol 0000.

"0001-12-31 23:00:00+00 BC"
Basil Bourque
sumber
Juga, video bagus tentang kegilaan zona waktu
billinkc
Titik pivot antara BC dan AD adalah tahun 1. Ini adalah tahun 1 atau tahun -1. Hanya bagaimana tahun awalnya dinamai. Tahun 0 tidak ada (atau lebih tepatnya, tidak terdefinisi karena lebih merupakan masalah definisi daripada eksistensial).
slebetman
Ingat jalan kembali selama perayaan 2000 ketika beberapa orang yang bertubuh kekar mengatakan bahwa milenium kedua secara teknis dimulai pada tahun 2001, bukan 2000? Itu sebabnya. Tahun dimulai dari 1, bukan 0. Dan tahun sebelum tahun 1 adalah tahun 1 SM (yaitu tahun -1)
slebetman
1
@slebetman yang tergantung pada kalender yang digunakan. The Gregorian proleptik memiliki kedua bentuk yang menggunakan 0 sebagai tahun sebelum 1 CE, dan bentuk yang menempatkan 1 BCE segera sebelum 1 CE (ISO 8601 mendukung keduanya dalam memiliki 0000sebagai nilai tahun yang valid tetapi tidak bersikeras apakah itu digunakan atau tidak ). Memang benar PostgreSQL menggunakan formulir tanpa tahun 0, tetapi Anda tidak dapat menyatakan "tahun memulai 1, bukan 0" seolah-olah itu semacam fakta universal. Sangat mudah untuk menerjemahkan di antara mereka untuk mis data astronomi. (Milenium ketiga masih dimulai pada tahun 2001, karena tetap milenium ketiga sejak 1 CE)
Jon Hanna
@ JonHanna: Tidak ada yang benar-benar menggunakan segala bentuk kalender Gregorian yang subur pada saat itu, jadi saya pikir adil untuk mengistimewakan kalender Julian di sini - yang tidak memiliki nol tahun.
Kevin

Jawaban:

22

Pada 18 November 1883 pukul 12.00 (waktu baru), waktu standar diadopsi oleh kereta api Amerika.

Ini berarti bahwa sebelum waktu itu, Los Angeles menggunakan waktu lokal aktual, berdasarkan waktu matahari rata-rata. Setelah itu, ia dipindahkan ke zona waktu lokalnya, yang, sebagai penyeimbang integral dari waktu Greenwich Mean Time, sedikit berbeda dari waktu sebelumnya.

Ingin tahu lebih banyak?

  • Unduh Database Zona Waktu tzdata dari IANA: Zona waktu .

  • Di dalam, Anda akan menemukan definisi dari zona waktu (banyak), yang memiliki banyak variasi dari waktu ke waktu, bersama dengan banyak komentar yang merinci perubahan apa yang dibuat di mana dan kapan. Ini bacaan yang menghibur!

  • Wikipedia juga memiliki beberapa fakta menarik, di halaman Wikipedia: Zona waktu , mengenai perubahan 1883, 18 November:

Waktu kereta api
...
Pengaturan waktu di jalur kereta Amerika pada pertengahan abad ke-19 agak membingungkan. Setiap kereta api menggunakan waktu standarnya sendiri, biasanya berdasarkan waktu setempat dari kantor pusatnya atau terminal yang paling penting, dan jadwal kereta api diterbitkan menggunakan waktunya sendiri. Beberapa persimpangan yang dilayani oleh beberapa jalur kereta api memiliki jam untuk setiap jalur kereta api, masing-masing menunjukkan waktu yang berbeda.
... Sistem Dowd tidak pernah diterima oleh perusahaan kereta api Amerika. Sebaliknya, kereta api AS dan Kanada menerapkan versi yang diusulkan oleh William F. Allen, editor Panduan Kereta Api Resmi Traveler. Perbatasan zona waktu membentang melalui stasiun kereta api, sering di kota-kota besar. Misalnya, perbatasan antara zona waktu Timur dan Tengahnya melewati Detroit, Buffalo, Pittsburgh, Atlanta, dan Charleston. Ini diresmikan pada hari Minggu, 18 November 1883 , juga disebut "The Day of Two Noons" , ketika setiap jam stasiun kereta api diatur ulang sebagai siang waktu standar dicapai dalam setiap zona waktu. Zona-zona itu bernama Antarkolonial, Timur, Tengah, Gunung, dan Pasifik. ...

Perhatikan juga bahwa ini tidak spesifik untuk Postgresql. Ini berlaku untuk semua perangkat lunak atau sistem operasi yang menggunakan basis data tzdata (walaupun tentu saja banyak yang akan terbatas pada tanggal setelah tahun 1970 atau pasca 1901, jadi tahun 1883 tidak terjangkau, tetapi ada banyak, banyak penyesuaian lainnya di semua tempat di waktu yang berbeda).

jcaron
sumber