Skip to content

Guide

Negatif Unix Zaman Damgaları: 1970 Öncesi Tarihler

Epok bir taban değildir — bir sıfır noktasıdır ve Unix zamanı onun içinden geriye doğru saymaktan son derece memnundur.

By Published

Çoğu insan Unix zamanıyla, bir günlük satırında veya bir created_at sütununda görülen türden, büyük, her zaman artan pozitif bir sayı olarak karşılaşır. Bu yüzden bir yerde -1234567890 ilk göründüğünde ve ayrıştırıcı bunu 1930'larda bir tarihe çözümlediğinde ya da bir hata fırlattığında bu yaygın bir sürpriz olur. Hiçbir tepki gerçekten sayının yanlış olmasıyla ilgili değildir. Unix zamanı, sabit bir sıfır noktasından işaretli bir sayım olarak tanımlandı ve işaretli bir sayım negatife gidebilir. Bu rehber, negatif bir zaman damgasının ne anlama geldiğini, gerçekte nerede karşılaşıldığını ve bazı kodların formatın en baştan beri desteklediği bir şeyde neden takıldığını kapsar.

Negatif bir zaman damgası gerçekte ne anlama gelir?

Bir Unix zaman damgası, 1 Ocak 1970'de 00:00:00 UTC'den — epoktan — bu yana geçen saniye sayısıdır. POSIX (IEEE Std 1003.1), alttaki türü, time_t'yi, epoktan yukarı sayılan değil, epoka göre sayılan işaretli bir tamsayı olarak tanımlar. Göreli sayımlar her iki yöne de gider: pozitif bir değer, epoktan sonra o kadar saniye; negatif bir değer ise ondan önce o kadar saniyedir. Sıfırın bir taban olmasında özel bir durum yoktur — bu sadece bir referans noktasıdır, tıpkı 0°C'nin bir referans noktası olup mümkün olan en soğuk sıcaklık olmaması gibi.

Yani negatif bir zaman damgası tam olarak beklediğiniz gibi çözümlenir:

Zaman damgası (saniye)UTC tarihi
01970-01-01T00:00:00Z
-11969-12-31T23:59:59Z
-864001969-12-31T00:00:00Z
-22089888001900-01-01T00:00:00Z
-10000000001938-04-24T22:13:20Z

Örüntü her iki yönde de doğrusaldır: epoktan önceki her saniye sayımdan bir çıkarır, tıpkı sonraki her saniyenin bir eklemesi gibi. Sıfırda endişelenecek bir süreksizlik yoktur.

Negatif zaman damgaları gerçekte nerede karşımıza çıkar?

Birine rastlamak için tarihsel veriye ihtiyacınız yok. En yaygın gerçek dünya kaynakları şunlardır:

Doğum tarihleri ve diğer 1970 öncesi kayıtlar. Doğum tarihlerini, tarihsel olayları veya arşiv kayıtlarını epok saniyesi olarak saklayan herhangi bir sistem, 1970'den önce doğan herkes için negatif değerler üretir — 2026 itibarıyla bu, 56 yaşın üzerindeki çoğu yetişkindir.

Varsayılan veya işaretçi değerler. Bazı kod tabanları, "ayarlanmamış" için yer tutucu olarak 0 veya küçük bir negatif sayı kullanır; bu daha sonra bir işaretçi yerine gerçek bir tarih olarak yanlış okunur — bir hatadır, ama negatif değerlerin geçersiz olmasına değil, en başta ayrıştırılabilir olmasına bağlı bir hatadır.

Saat kayması ve test düzenekleri. Sistem saati kötü şekilde yanlış olan bir istemci ya da kasıtlı olarak bir uç durum tarihi seçen bir birim testi, kimse gerçekten tarihsel veri kastetmeden epoktan çok önce negatif bir değer üretebilir.

Bazı araçlar neden yine de reddediyor?

Reddetme neredeyse her zaman bir uygulama tercihidir, bir spesifikasyon gerekliliği değil. Üç örüntü bunun çoğunu açıklar:

Bazı eski veya gömülü sistemler, gelecekteki aralığı iki katına çıkarmak için ya da platform hiçbir zaman 1970 öncesi tarihler beklemediği için, time_t için POSIX'in işaretli türü yerine işaretsiz bir tamsayı kullandı. İşaretsiz bir türün negatif sayılar için hiçbir temsili yoktur — bu bir depolama kararıdır, Unix zamanının ne anlama gelebileceğiyle ilgisizdir.

Bazı form doğrulamaları veya API şemaları, alan yalnızca "şimdiye yakın" değerler (bir giriş zamanı, bir istek zamanı) tutması beklendiği için timestamp >= 0 gibi bir kural ekler ve yazar türün bir doğum tarihi veya tarihsel alan için de yeniden kullanılacağını hiç düşünmemiştir.

Ve bazı ayrıştırıcılar yalnızca yakın, pozitif değerlere karşı yazılıp test edilmiştir; bu yüzden negatif bir değer, kimsenin önde bir eksi işaretine karşı kontrol etmediği bir kod yolunu — genellikle dizeden sayıya ayrıştırma veya "16 basamak mikrosaniye anlamına gelir" gibi basamak sayısına dayalı birim tespiti — çalıştırır.

Bunların hiçbiri zaman damgasının kendisinin hatalı biçimlendirildiği anlamına gelmez. Şemayı siz kontrol ediyorsanız, çözüm, işaretli 64 bit bir tür kullanmak (zaten her ana akım dil ve veritabanının varsayılanı) ve alan gerçekten asla tarihsel olamayacaksa keyfi >= 0 kısıtlamasını kaldırmaktır.

Negatif bir zaman damgasını doğru çevirmek

Dönüşüm matematiği pozitif bir zaman damgasıyla aynıdır — dilinizin tarih kurucusu milisaniye bekliyorsa (çoğu bekler: örneğin JavaScript'in Date'i, karşılaşacağınız herhangi bir negatif değeri rahatça kapsayan kabaca ±8,64 × 1015 aralığında milisaniye değerlerini kabul eder) saniyeden milisaniyeye geçmek için 1000 ile çarpın. Tek pratik fark, birçok zaman damgası aracının (bizimki dahil) saniye, milisaniye ve mikrosaniyeyi tahmin etme şekli olan basamak sayısına göre birim tespitidir: önde bir eksi işareti, basamakları saymadan önce çıkarılmalı, sonra sonuca yeniden uygulanmalıdır. Doğru yapıldığında, negatif bir zaman damgası, tam olarak pozitif biri gibi ISO 8601 üzerinden gidip gelir — basamak sayısı tespitinin kendisinin nasıl işlediği için epok ve hassasiyet rehberimize bakın.

Kısa versiyon

Negatif bir Unix zaman damgası bir hata durumu değildir — formatın tam olarak belirtildiği gibi çalışmasıdır, sabit bir sıfır noktasından ileri yerine geriye doğru sayar. Kendi kodunuz negatif değerleri reddediyorsa, bu sizin eklediğiniz bir doğrulama kuralıdır, formatın bir sınırı değildir. Ve üçüncü taraf bir araç bunları reddediyorsa, çözüm genellikle işaretli 64 bit bir epok dönüştürücüsü gibi, gerçekten 1970 öncesi girdiye karşı test edilmiş bir araca geçmektir.

Frequently asked questions

Bir Unix zaman damgası negatif olabilir mi?
Evet. POSIX, time_t'yi epoka (1 Ocak 1970, 00:00:00 UTC) göre işaretli bir saniye sayısı olarak tanımlar, taban olmadan. Negatif bir değer basitçe epoktan önceki bir anı ifade eder — -86400, tam olarak bir gün önceki 31 Aralık 1969, 00:00:00 UTC'dir.
Bazı araçlar negatif zaman damgalarını neden reddediyor?
Tarihsel olarak bazı sistemler time_t'yi işaretsiz bir tamsayı olarak veya neredeyse hiç aralığı olmayan işaretli bir 16 bit değer olarak sakladı ve bazı ayrıştırıcılar yalnızca 1970 sonrası girdiye karşı test edildi. Ne format ne de standart negatif değerleri yasaklar — reddetme bir uygulama tercihidir, genellikle 'zaman damgası'nın 'yakın zaman' anlamına geldiğini varsayan koddan kalmadır.
Negatif bir zaman damgasını nasıl bir tarihe çeviririm?
Pozitif bir zaman damgasıyla aynı şekilde: dilinizin Date kurucusu milisaniye bekliyorsa milisaniyeye geçmek için 1000 ile çarpın, sonra takvim tarihini hesaplamasına izin verin. -1000000000 (saniye) 1938-04-24T22:13:20Z olur. Bunu doğrudan zaman damgası dönüştürücüye yapıştırın, aynı şekilde çözümlenir.
64 bit işaretli bir zaman damgasının temsil edebileceği en erken tarih nedir?
64 bit işaretli bir tamsayı, epoktan yaklaşık ±292 milyar yılı tutabilir; bu, herhangi bir takvim sisteminin pratik aralığının çok ötesindedir — gerçek sınır, tamsayı formatı değil, kullandığınız tarih kütüphanesi veya takvim algoritmasıdır.

Sources & references

Authoritative references cited by this piece. Verified by Buğra Sözeri on the dates shown and re-checked at every deploy.

Related

Published September 25, 2026