Saat dilimi neden Postgres'te 0001 yılında UTC'den böyle çılgın bir dengelemeye sahip?


16

Postgres 9.5'te, yıl ile denemeler yaparken 0001(sıfır yıl yok 0000) aşağıda görülen sonucu gördüğüme şaşırdım .

Ofseti -07:52:58?

Bazı örnek kodlar. Ben karma kullanımı o Not TIMESTAMP WITH TIME ZONEve TIMESTAMP WITHOUT TIME ZONEçok dikkatlice okuyun.

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")

Bunun ikinci değere tarafından sürpriz: 0001-12-31 16:07:02-07:52:58 BC. America/Los_AngelesUTC'nin sekiz saat gerisinde olduğu gibi sekiz saat geriye gitmemiz gerektiğini anlıyorum -08:00. Ama -08:00ofset yerine -07:52:58. Neden?

UTC altında sorun yok

UTC altında veri girerken böyle bir sorun yok.

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")

Sıfır Yıl Yok

Bu arada, tarih bölümü doğru görünüyor. Görünüşe göre 0000“BC” ve “AD” dönemleri arasındaki pivot nokta olmak için bir yıl yok . 0001 yılının ilk anını alın, bir saat çıkarın ve yıl olsun 0001 BC- sıfır yıl yok.

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_ ;

Sonuç yıl 0001 BCbiz atlamak böylece, 0001hiç 0001 BC; sıfır yıl yok 0000.

"0001-12-31 23:00:00+00 BC"


BC ve AD arasındaki pivot noktası 1. yıldır. 1 ya da -1 yıldır. Yıllar ilk olarak nasıl adlandırılır. Yıl 0 mevcut değildir (ya da daha çok varoluşçu olmaktan ziyade bir tanım problemi olduğu için tanımsızdır).
slebetman

Bazı bilgiç insanlar, ikinci binyılın teknik olarak 2000 yılında değil, 2000 yılında başladığını söylediğinde 2000 kutlamaları sırasında hatırlıyor musunuz? Bu yüzden. Yıllar 0'da değil, 1'de başlar. Ve yıl 1'den önceki yıl MÖ 1. yıl (yani -1 yıl)
slebetman

1
@slebetman kullanılan takvime bağlıdır. Proleptik Gregoryen, hem 1 CE'den önceki yıl olarak 0 kullanan bir forma hem de 1 CE'den hemen önce 1 BCE yerleştiren bir forma sahiptir (ISO 8601, her ikisinin de 0000geçerli bir yıl değerine sahip olmasını destekler, ancak kullanılıp kullanılmadığı konusunda ısrar etmez ). PostgreSQL'in formu 0 yıl olmadan kullandığı doğrudur, ancak evrensel bir gerçekmiş gibi "yıl 1 değil 0 başlar" diyemezsiniz. Örneğin astronomik veriler için aralarını çevirmek kolaydır. (Üçüncü binyıl 2001'de hala her iki şekilde de başladı, çünkü 1 CE'den beri üçüncü binyıl olarak kaldı)
Jon Hanna

@JonHanna: Hiç kimse o sırada proleptik Gregoryen takviminin herhangi bir biçimini kullanmıyordu, bu yüzden Julian takvimini burada bir yıl sıfır olmayan ayrıcalıklı kılmak adil olur.
Kevin

Yanıtlar:


22

18 Kasım 1883'te saat 12: 00'de (yeni saat), Amerikan demiryolları tarafından standart zaman kabul edildi.

Bu, o zamandan önce, Los Angeles'ın ortalama güneş saatine bağlı olarak gerçek yerel saati kullandığı anlamına gelir. Bundan sonra, Greenwich Ortalama Zamanından saatlerin ayrılmaz bir farkı olan yerel zaman dilimine taşındı, önceki zamandan biraz farklıydı.

Daha fazla bilmek ister misiniz?

  • Tzdata Timezone Veritabanını IANA'dan indirin : Zaman dilimleri .

  • İçeride, zaman içinde çok fazla varyasyona sahip (birçok) zaman diliminin tanımlarını ve yapılan ve ne zaman neyin değiştiğini detaylandıran birçok yorum bulacaksınız. Eğlenceli okuma!

  • Wikipedia'nın 1883, 18 Kasım değişikliği ile ilgili Wikipedia: Saat dilimi sayfasında da bazı ilginç gerçekleri var :

Demiryolu zamanı
...
19. yüzyılın ortalarında Amerikan demiryollarında zaman tutma biraz karışıktı. Her demiryolu, genellikle genel merkezinin yerel saatine veya en önemli terminaline bağlı olarak kendi standart zamanını kullandı ve demiryolunun tren tarifeleri kendi saatleri kullanılarak yayınlandı. Birkaç demiryolunun hizmet verdiği bazı kavşakların her bir demiryolunda her biri farklı bir zaman gösteren bir saati vardı.
... Dowd sistemi asla Amerikan demiryolları tarafından kabul edilmedi. Bunun yerine, ABD ve Kanada demiryolları, Traveler's Official Railway Guide editörü William F. Allen tarafından önerilen bir versiyon uyguladı. Zaman dilimlerinin sınırları, çoğunlukla büyük şehirlerde bulunan demiryolu istasyonlarından geçiyordu. Örneğin, Doğu ve Merkezi saat dilimleri arasındaki sınır Detroit, Buffalo, Pittsburgh, Atlanta ve Charleston'dan geçiyordu. 18 Kasım 1883 Pazar günü, "İki Öğün Günü" olarak da adlandırılan ve her bir tren istasyonu saatinin, her bir zaman diliminde standart zaman öğlenine ulaşıldığı şekilde sıfırlandığı zaman açıldı. Bölgelere Intercolonial, Eastern, Central, Mountain ve Pacific adı verildi. ...

Ayrıca Postgresql için özel olmadığını unutmayın. Bu, tzdata veritabanını kullanan herhangi bir yazılım veya işletim sistemi için geçerlidir (tabii ki birçok kişi 1970 sonrası veya 1901 sonrası tarihlerle sınırlı olacaktır, bu nedenle 1883 erişilemez, ancak her yerde çok sayıda başka ayar vardır. farklı zamanlar).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.