Unix Zaman Damgaları, Baş Ağrısı Olmadan
Üç geliştiriciye saatin kaç olduğunu sorun; oturdukları yere bağlı olarak üç farklı cevap alabilirsiniz. Bir Unix zaman damgasına sorun ve dünyanın her yerinden herkes için aynı olan tek bir sayı elde edersiniz. Bu tek tamsayı, dokunacağınız neredeyse her günlük dosyasının, veritabanı satırının ve API yanıtının arka planında sessizce çalışan epoch zamanının neden bu kadar yaygın olduğunu açıklar. Bu sayfa o sayının ne anlama geldiğini, her iki yönde de nasıl okunduğunu ve nerede zorlandığınızı açıklar.

Unix zamanı aslında nedir?
Unix zaman damgası, artık saniyeler sayılmaksızın 1 Ocak 1970 saat 00:00:00 UTC'den bu yana geçen saniye sayısıdır. Bu ana epoch denir ve erken Unix mühendisleri tarafından yalnızca sayım yapmak için kullanışlı bir yuvarlak tarih olduğu için seçilmiştir. Epoch'ta değer tam olarak 0'dır. O tarihten bu yana geçen her saniye bir ekler; dolayısıyla sayı yalnızca artar. 1970 öncesi tarihler de tamamen geçerlidir; negatif tamsayılar olarak ifade edilir.
Bu kavramı POSIX zamanı veya gevşek biçimde epoch zamanı olarak da duyarsınız. Etiket ne olursa olsun, mekanik aynıdır: sürekli artan bir saniye sayacı. Biçimlendirilmiş bir dize yerine düz bir tamsayı olduğundan, bir bilgisayar onu birkaç bayta sığdırabilir ve ikisini tek bir çıkarmayla karşılaştırabilir.
Saniyeler, milisaniyeler ve arkadaşları
Klasik Unix zamanı tam saniyeleri sayar; bugün gördüğünüz tanıdık on basamaklı sayıyı verir. Ancak pek çok ortam daha ince çözünürlüğe ihtiyaç duyar. JavaScript örneğin milisaniye cinsinden çalışır ve on üç basamaklı bir değer üretir; bazı sistemler mikrosaniye veya nanosaniyeye kadar iner. Güvenilir bir pratik kural: on basamaklı bir sayı saniyedir, on üç basamaklı milisaniyedir. Dönüştürülmüş tarihiniz bugünü beklediğiniz halde 1970 civarına denk geliyorsa, neredeyse kesinlikle milisaniyeleri saniye alanına veya tersini beslediniz. Dönüştürücümüz büyüklüğü otomatik olarak algılar; bu nedenle tahmin etmeniz nadiren gerekir.
Geliştiriciler neden buna güvenir?
Büyük avantaj, zaman damgasının saat dilimsiz olmasıdır. 1735689600 tamsayısı, Tokyo'da, Berlin'de ve São Paulo'da aynı ana karşılık gelir. Biçimlendirilmiş yerel bir dize yerine bu sayıyı saklamak, bir değerin hangi saate ait olduğunu asla merak etmemenizi sağlar. Sıralama da önemsizdir; çünkü kronolojik sıra yalnızca sayısal sıradır; dolayısıyla zaman damgası sütunu üzerindeki bir veritabanı dizini, ayrıştırma olmadan olayları doğru sıralar. Aritmetik de eşit derecede temizdir: iki olay arasındaki boşluk tek bir çıkarma işlemidir ve bir gün eklemek 86400 eklemektir. Bu özellikler tam olarak günlüklerin, token'ların, önbelleklerin ve mesaj kuyruklarının epoch zamanına başvurmasının nedenidir.
Her iki yönde dönüştürme
Zaman damgasından insan tarihine geçmek, saniye sayısını alıp bir takvime yansıtmak ve ardından önem verdiğiniz saat diliminde biçimlendirmek demektir. Ters yönde ise yıl, ay, gün ve saati alır, hangi saat diliminde ifade edildiğine karar verir ve epoch'tan bu yana saniyeye geri daraltırsınız. Aracımız her iki yönü de anında ve tamamen tarayıcınızda yapar; dolayısıyla yapıştırdığınız hiçbir şey makinenizden ayrılmaz. Bir sayıyı çözmek için yapıştırın ya da bir tarih seçip kodlayın; sonucu aynı anda hem UTC hem de yerel saatinizde okuyun.

UTC ile yerel saat, klasik tuzak
Zaman damgasının kendisinde saat dilimi yoktur; her zaman UTC'ye bağlıdır. Karışıklık yalnızca görüntülediğinizde ortaya çıkar. 1700000000'ı dönüştürürseniz ve ekranınız bir akşam saati gösterirken başka bir ülkedeki bir iş arkadaşınız bir öğleden sonra görüyorsa, hiçbir şey bozuk değildir; ikiniz de farklı yerel saatlerde işlenen aynı ana bakıyorsunuz. Hatalar, kod yerel bir tarihi UTC gibi okuduğunda ya da ofset kaydetmeden duvar saati zamanını damgaladığında ortaya çıkar. Güvenli alışkanlık, UTC'yi saklamak ve iletmek, yerel ofseti yalnızca son anda, değeri bir kişiye gösterirken uygulamaktır. Şüphelendiğinizde, yerel satıra değil dönüştürücüdeki UTC satırına karşı karşılaştırın.
2038 yılı sorunu
Pek çok eski sistem Unix zamanını işaretli 32 bitlik bir tamsayıda saklardı. Bu alan, sayacın taşarak negatif bir sayıya döndüğü 19 Ocak 2038 UTC 03:14:07'den bir saniye sonra dolup taşar; tarihleri potansiyel olarak 1901'e geri fırlatır. Y2K sorunuyla aynı aileden bir sorundur. İyi haber şu ki modern işletim sistemleri ve diller büyük ölçüde 64 bitlik zaman damgalarına geçmiştir; bu zaman damgaları yaklaşık 292 milyar yıl boyunca taşmaz. Dolayısıyla yeni kodlar için bu, acil bir durum olmaktan çok bilinmesi gereken tarihsel bir meraktır.
Daha fazla tarayıcı tabanlı yardımcı için geliştirici araçlarımıza bakın; sayılarla çalışmanız gerekiyorsa hesap makineleri bir tık uzağınızdadır.
Sıkça sorulan sorular
Unix zaman damgası nedir?
Artık saniyeler sayılmaksızın 1 Ocak 1970 saat 00:00:00 UTC'den bu yana geçen saniye sayısıdır. Bu başlangıç anına epoch denir ve sayı zamanla yalnızca artar.
Sayım neden 1970 civarına bir tarihe dönüşüyor?
Büyük olasılıkla saniyeler ile milisaniyeleri karıştırdınız. On basamaklı bir sayı saniyedir, on üç basamaklı bir sayı milisaniyedir. Milisaniyeleri saniye alanına beslemek, görünür zamanı yaklaşık bine böler ve sizi epoch'a yakın bir yere bırakır.
Unix zaman damgasının saat dilimi var mıdır?
Hayır. Değer her zaman UTC'ye bağlıdır. Bir saat dilimi yalnızca zaman damgasını insan tarafından okunabilir bir tarih olarak görüntülediğinizde devreye girer; bu nedenle aynı sayı farklı kişilere farklı duvar saati zamanları gösterebilir.
Bir tarihi zaman damgasına nasıl dönüştürürüm?
Yıl, ay, gün ve saati girin, bu tarihin hangi saat diliminde ifade edildiğine karar verin; araç onu epoch'tan bu yana saniyeye daraltır. Her iki yönü de bu sayfada tarayıcınızda anında yapabilirsiniz.
2038 yılı sorunu nedir?
Unix zamanını işaretli 32 bitlik bir tamsayıda saklayan sistemler, 19 Ocak 2038 UTC 03:14:07'den bir saniye sonra taşar. Modern 64 bitlik zaman damgaları bu sorunu milyarlarca yıl boyunca önler; dolayısıyla mevcut yazılımların büyük çoğunluğu etkilenmez.
Verilerim bir sunucuya gönderiliyor mu?
Hayır. Dönüştürme tamamen tarayıcınızda çalışır; dolayısıyla yapıştırdığınız her zaman damgası veya tarih kendi cihazınızda kalır.
