Epoch'tan Bu Yana Geçen Süre
(aphyr.com)- POSIX time/Unix time çoğunlukla 1970-01-01 00:00:00’dan bu yana geçen saniye sayısı olarak anılsa da, gerçekte artık saniyeleri yok sayan UTC tabanlı bir değer olduğundan gerçek geçen saniyelerle örtüşmez
- 2024-12-25 18:51:26 UTC itibarıyla POSIX time 1735152686’dır; epoch’tan bu yana gerçekten geçen süre ise 1735152713 saniyedir, yani arada 27 saniye fark vardır
- IEEE 1003.1,
seconds since the Epochtanımında bir günü her zaman 86.400 saniye olarak hesaplar; standardın eki de 1970’ten sonra eklenen 14 artık saniyeyi uyumluluk ve hesaplama kolaylığı için yok sayar - UTC, güneş günüyle farkı azaltmak için artık saniye ekler; bu sırada POSIX time geriye sıçradığı için Linux, Qantas, Cloudflare DNS gibi sistemlerde arıza örnekleri yaşanmıştır
- Tek bir bilgisayarda zaman aralığı ölçmek için
CLOCK_MONOTONICveyaCLOCK_BOOTTIMEdaha uygundur; POSIX timestamp ile uyumlu olmak gerekiyorsa leap smear ya da POSIX↔TAI dönüşümü düşünülmelidir
POSIX time gerçek geçen saniye sayısı değildir
- JavaScript
Date, GNU coreutils, Linuxtime(2), Gotime.Unix, MySQLdatetime, RubyTime, Cassandratimestampgibi araçlar POSIX time’ı çoğunlukla Unix epoch’tan bu yana geçen saniye sayısı gibi ele alır - Ancak bu ifade genel sezgiyle tam olarak uyuşmaz
- Örnek zaman: 2024-12-25 18:51:26 UTC
- POSIX time: 1735152686
- POSIX epoch’tan bu yana gerçekten geçen saniye: 1735152713
- Fark: 27 saniye
- Bu fark, POSIX time’ın IEEE 1003.1 içinde UTC’den türetilmesine rağmen, tüm günleri tam olarak 86.400 saniye varsaymasından kaynaklanır
- Standarttaki
seconds since the Epochtanımı değeritm_sec,tm_min,tm_hour,tm_yday,tm_yearkullanarak hesaplar; 1970’ten önceki yıllarla veya negatif değerlerle ilişkisini tanımlamaz - Gerçek bir günün uzunluğu her zaman 86.400 saniye değildir ve zamana göre değişir
- UTC tarihinin güneş gününden fazla uzaklaşmaması için astronomlar düzenli aralıklarla artık saniye ilan eder
- Bunun sonucunda POSIX time birkaç yılda bir geriye sıçrayabilir
- Bir gün ileriye de sıçrayabilir
- Artık saniyeler geçmişte gerçek arızalara yol açmıştır
- Linux çekirdeğiyle ilgili artık saniye sorunu
- Qantas’ta Linux artık saniye hatası nedeniyle yaşanan gecikmeler
- Cloudflare DNS üzerindeki artık saniye etkisi
Standardın uzlaşması ve pratik alternatifler
- IEEE 1003 Ek B, standardın yayımlandığı sırada 1970-01-01’den sonra 14 artık saniye eklenmiş olsa da, kolay hesaplama ve uyumluluk için bu 14 saniyenin yok sayıldığını belirtir
- Standart, çoğu sistemdeki “time” değerinin sürekli arttığını varsayar ve artık saniye sırasında da bu değerin artması gerektiği yönünde seçim yapar
- Aynı zamanda çoğu sistemin artık saniyeleri takip etmeyebileceğini veya standart zaman referansına senkronize olmayabileceğini varsayar
- Bu yüzden
seconds since the Epochdeğerinin referans zaman ile epoch arasındaki tam saniye sayısını mutlaka göstermesini şart koşmaz - Uygulamaların bu değeri epoch’tan bu yana geçen saniye sayısı gibi ele alabilmesi yeterlidir; gereken doğruluğun sistem tedarikçileri ve yöneticileri tarafından sağlanması gerektiği görüşündedir
- Dağıtık uygulamalarda olaylar timestamp ile senkronize edildiğinden tutarlı yorumlama önemli hale gelebilir
- Artık saniye birikimi öngörülemez
- Epoch’tan bu yana artık saniye sayısının artması olasıdır
- Standart, astronomik ölçekte kısa süreli uygulamalar arasında zaman senkronizasyonuyla daha çok ilgilenir
- Gerçek sistemler zaman biraz sapsa da genellikle çalışır; ancak artık saniyeler nadirdir ve “epoch’tan bu yana geçen saniye sayısı” biçimindeki doğrusal sezgi güçlü olduğundan keşfedilmemiş hatalar birikebilir
- Duruma göre alternatifler şunlardır
- Tek bir bilgisayarda iki olay arasındaki duration’ı hesaplıyorsanız
CLOCK_MONOTONIC, hattaCLOCK_BOOTTIMEkullanın - POSIX time varsayan diğer sistemlerle timestamp alışverişi yapmanız gerekmiyorsa TAI, GPS, LORAN kullanın
- POSIX timestamp sistemleriyle kabaca uyumlu olmanız gerekiyorsa leap smear ile artık saniyeyi daha uzun bir zaman aralığına yayın
- qntm’in t-a-i gibi kütüphanelerle POSIX ve TAI arasında dönüşüm yapılabilir
- Tek bir bilgisayarda iki olay arasındaki duration’ı hesaplıyorsanız
- Artık saniyeleri kaldırmaya yönelik çalışmalar sürüyor ve bunun 2035’e kadar gerçekleşmesi bekleniyor
Bir gün 86.400 saniyedirvarsayımına dayanan her şeye dönüşüm tablosu eklemek gibi ek çalışmalar gerekecek- 2035 sonrasındaki zamanlar için “iki zaman arasında kaç saniye vardır” gibi sorular çok daha basit hale gelebilir
1 yorum
Hacker News yorumları
Vernor Vinge’in 2000 tarihli bilimkurgu romanı A Deepness in the Sky’ı yeni okudum; epoch’tan bu yana geçen saniyelere (seconds since the epoch) beklenmedik bir gönderme yapan harika bir kitap.
“Traders’ın zamanı ölçme biçimine bakın…” diye başlayıp, Qeng Ho’nun zamanı insanlığın Old Earth’ün Ay’ına ilk ayak bastığı andan itibaren saniye cinsinden saydığını, ama daha yakından bakınca başlangıç anının aslında yaklaşık 15 milyon saniye sonrası, insanlığın erken dönem bilgisayar işletim sistemlerinden birinin sıfırıncı saniyesi olduğunu anlatıyor.
Daha fazla “uzayda bilgisayar bilimi” istiyorsanız Bobiverse serisini, daha fazla “insan + simülasyon + bilgisayar” incelemesi istiyorsanız Permutation City’yi öneririm.
Zaman ölçümü hakkında ne zaman okusam mutlaka yeni bir şey öğreniyorum. Unix zamanını, rollover’ı saymazsak zamanı izlemenin en basit yolu sanıyordum; artık saniyeleri biliyordum ama bunun burada da geçerli olduğunu düşünmemiştim.
“UTC, GPS, LORAN and TAI” bağlantısını da okudum; GPS zamanının artık saniyeleri yansıtmaması ilginç bir karşıtlık.
“2035’e kadar artık saniyeleri kaldırmaya yönelik çalışmalar sürüyor” planı pek hoşuma gitmiyor.
UTC’nin özü, TAI’den tam sayı saniye kadar uzak olup ortalama güneş zamanına (MST) yakın kalmasıdır. Artık MST’yi izlemeyeceksek doğrudan TAI’ye geçmeliyiz.
UTC’nin MST’den uzaklaşmasına izin verirsek, geçmiş artık saniyeleri hâlâ ele almak zorunda kalırız ama o artık saniyelerin artık bir amacı kalmaz; ne yardan ne serden bir durum oluşur.
Yine de bu öneri tamamen anlamsız değil. Mevcut UTC zaman yönetimini değiştirmeden, 2035 sonrası iki zaman damgası arasındaki farkın doğru fiziksel saniye sayısı olmasını amaçlıyor.
Yine de MST zaten UTC’nin bir işleviyken bunu kaldırmak tuhaf görünüyor.
Ama gerçekte birçok sistem yanlış seçimi yaptı; özellikle de UNIX bunun en büyük nedeni. Bu tercih sayısız sisteme ve düzenlemeye o kadar derin işlemiş durumda ki “doğrudan TAI’ye geçmek” fiilen imkânsız.
Bu yüzden UTC’yi “yeni TAI” olarak yeniden yorumlamak daha kolay. Bir gün eski UTC’nin başka bir adla yeniden ortaya çıkmasına şaşırmam.
Çoğu ülkede, hatta belki hepsinde, sivil zaman UTC’ye dayanır. Biraz daha saf diye dünya genelindeki saatleri yaklaşık 30 saniye geri alacak değiliz.
GPS zamanının da TAI ile bir ofseti var ama kimse bunu pek umursamıyor. Unix epoch’u da aynı; sonuç tutarlıysa yeterli.
Leap_Secondadlı bir dosya oluşturun. Her ay bu dosyanın varlığına bakın; varsa silipLeap_Secondsdosyasındaki değere 1 ekleyin veLSSEadlı bir yedek oluşturun.“You are not expected to understand this.” İki sistemi de sürdürme yöntemi bu. İsterseniz hash ya da arama tablosu olarak da yapabilirsiniz.
Modern UTC epoch’unun 1 Ocak 1972 olması da önemli. Ondan önce UTC, TAI’den farklı saniye uzunlukları kullanıyordu.
1971 sonunda ara aşama olarak tam 0,107758 TAI saniyelik son düzensiz sıçrama vardı ve 1958–1971 arasında UTC veya TAI’deki küçük zaman adımları ile frekans ayarlamalarının toplamı tam 10 saniye olacak şekilde ayarlanmıştı. Bu yüzden 1 Ocak 1972 00:00:00 UTC, tam olarak 1 Ocak 1972 00:00:10 TAI idi; o tarihten sonra fark tam sayı saniyeler oldu.
Aynı zamanda UTC’nin tik hızı TAI ile tamamen aynı hale geldi ve UTC, UT2 yerine UT1’i izlemeye başladı. Dolayısıyla 1970 ve 1971’deki Unix zamanı, o dönemin gerçek UTC zamanı ile uyuşmaz.
https://en.wikipedia.org/wiki/Coordinated_Universal_Time#His...
https://en.wikipedia.org/wiki/Unix_time#UTC_basis
Doğum belgesindeki zamanın saniye düzeyinde doğru olduğunu varsaysak bile. Çünkü bu kişilerin yaşamlarının bir bölümünde “1 saniyenin uzunluğu” sayılan değer, bugün genelde düşündüğümüz 1 saniyeye kıyasla epey farklıydı.
Burada saniye, sezyum-133 atomunun bozulmamış temel durum aşırı ince geçiş frekansı olan 9.192.631.770/s’ye dayalı saniye anlamına gelir.
Yakın zamanda bir borsa için kod yazdım; sistem VAX ya da daha doğrusu OpenVMS üzerinde çalışıyordu ve epoch 17 Kasım 1858’di.
Kariyerimde Unix dışı bir epoch’u ilk kez görmüştüm; neyse ki kullandığım kodda Unix epoch olarak soyutlanmıştı.
https://www.slac.stanford.edu/~rkj/crazytime.txt
1950’lerin bilgisayar belleğine bu tarihleri sığdırmak için takvim 2,4 milyon gün ötelenmiş ve bunun sonucunda 0. gün 17 Kasım 1858 olmuş.
https://www.joelonsoftware.com/2006/06/16/my-first-billg-rev...
macOS/Swift Foundation API’si
NSDate.timeIntervalSinceReferenceDate, epoch olarak 1 Ocak 2001’i kullanır.Wikipedia’da da faydalı bir liste var: https://en.wikipedia.org/wiki/Epoch_(computing)#Notable_epoc...
Bazı anlar POSIX zaman damgası ile ifade edilemez; bazı POSIX zaman damgaları da gerçek zamandaki bir ana karşılık gelmez.
Bu, ISO 8601 yılı olmayan anlar olduğunu söylemeye benziyor. Her anın bir yılı vardır; sadece bazı yıllar diğerlerinden daha uzundur.
https://time.is/UTC adresini açıp izlerseniz zaman monoton biçimde artar; arada sırada sadece bir saniye çok az daha uzun olur. Örneğin 24 saat boyunca yaklaşık %0,001 daha uzun olması gibi.
Veritabanında tarih saklarken her zaman Unix epoch zamanı olarak saklarım ve tarih alanına zaman dilimi bilgisini yazmam. Zaman dilimini bilme gereksinimi varsa ayrıca saklarım.
Bunun yerine zaman damgasını TAI biçiminde saklayıp gerektiğinde UTC’ye çeviren bir fonksiyon kullanarak Dünya ile ilgili düzeltmeler gerektiğinde bunları ele almak mı gerekir diye merak ediyorum.
Zaman dilimlerinin mayın tarlası olduğunu biliyorum; ama bu da zaman dilimi sınırlarının zaman içinde değiştiği insani bir kurgudan ibaret. Mutlak zamana sabitleyip gerektiğinde istenen yerel zaman biçiminde render etmek gerekiyor gibi.
Artık saniye ayarlaması, zaman dilimi dönüşümüyle aynı yerde yapılmalıdır. Ne yazık ki Unix yanlış şeyi standartlaştırdı ve migrasyon zor.
Dolayısıyla tüm saatler zaten UTC’ye göre ayarlanmıştır. Saklarken UTC’den TAI’ye çevirip okurken tekrar geri çevirmek gerekeceği için ortalık karışır.
Genelde veritabanlarında saklanan zaman damgası için bir zaman dilimi kavramı yoktur(SQL Server) ya da “zaman dilimi farkında” zaman damgası tipi sunarlar ama girdiyi UTC’ye çevirip özgün zaman dilimini atarlar(MySQL, Postgres).
Bildiğim kadarıyla yalnızca Oracle,
with time zonetipinde yerel olmayan zaman dilimlerini gerçekten gidiş-dönüş koruyabiliyor.Bazı hesaplamalarda 1 saniyelik fark büyük sorundur. En yaygın kullanılan biçim olmayan bir şeyi benimserken dikkatli olmak ve standarttan sapmak için geçerli bir nedeniniz olmak zorunda. Sadece farklı olması bile maliyeti ciddi şekilde artırabilir.
Bu yazı yüzünden Noel’im mahvolmuş gibi hissediyorum. Kutsal hiçbir şey yok mu? Saniyeler epoch’tan bu yana geçen saniyeler olmalı.
Güneş gününden biraz sapmasını neden umursamamız gerektiğini anlamıyorum. Epoch’tan bu yana geçen saniyeleri tarih gösterimine çeviren dönüştürücü düzeltmeyi üstlense olmaz mı?
Tüm yazılımların artık saniye eklemelerini hard-code etmesini, smear işlemini ele almasını ve yeni bir artık saniye eklendiğinde bir ay içinde güncelleme yöntemi gerektirmesini istemeyiz.
Şimdiye kadar bunun için endişelenmemiz ya da düşünmemiz gerekmedi; bundan sonra da gerek yok. Doğru şekilde ele alınıyor.
Artık saniyelerin yerini ekvatora yerleştirilmiş dev roketler almalı. Saatleri ayarlamayalım, gezegeni ayarlayalım.
İslam geleneğinde kıyamet ve Deccal(Dajjal) hakkında anlatılanlarda da bunun gerçekten yaşanmasına benzer bir bölüm var. “Deccal’in ilk günü bir yıl gibi, ikinci günü bir ay gibi, üçüncü günü bir hafta gibi olacak” denir; birçok kişi bunu kelimenin tam anlamıyla, yani Dünya’nın dönüşünün gerçekten yavaşlayıp sonunda yön değiştirerek güneşin batıdan doğduğu kozmik bir olay olarak kabul eder. Bu, insanlığın sonunun son alametidir.
Artık saniye yüzünden epoch’un
date +%s’in ima ettiğinden 29 saniye daha eski hale gelmesi neyi değiştirir, anlamıyorumHerkesin mevcut zamanı gösteren bir N sayısı üzerinde anlaşması çok daha önemli. Varsayımsal -29 saniye gerçek dünyayı etkilemez. 30 yıl önceki bir hedefe füze nişanlama rutini çalıştıracak değiliz ya
Artık saniyenin kaldırılmasını destekliyorum, ama zaman tutarsızlığını vurgulamanın faydalı olduğunu düşünmüyorum. Teknik olarak doğru olsa bile
Daha önemlisi geleceğe etkisi. Geçmiş zaman damgalarının basit bir “şimdi - N saniye” hesabından birkaç saniye farklı olabilmesi çoğu durumda ilginç bir bilgi sayılır; ama gelecekte bir noktada tüm saatlerin yeniden 1 saniye kaydırılmak zorunda kalabilmesi daha önemli. Bunu hesaba katmanın ciddi çaba gerektirdiği pek çok gerçek dünya örneği var