Makale
Unix zaman damgaları ve cron ifadeleri açıklandı
Unix zaman damgası yalnızca bir tamsayıdır. Cron ifadesi yalnızca beş alandan oluşur. Her ikisi de arka uç çalışmalarında sürekli karşımıza çıkar ve her ikisi de öngörülebilir biçimlerde insanları yanıltır: biri saat dilimleri nedeniyle, diğeri birim yüzünden.
Unix zaman damgası nedir
Unix zaman damgası, Unix epoch olarak bilinen referans noktası olan 1970-01-01 00:00:00 UTC'den bu yana geçen saniye sayısını sayar. Bu tanımın iki önemli sonucu vardır. Birincisi, sayım UTC cinsindedir: sayının içine gömülü bir saat dilimi yoktur. 1718400000, onu saklayan makinenin nerede bulunduğundan bağımsız olarak Dünya'nın her yerinde aynı anı ifade eder. İkincisi, epoch saniye cinsinden tanımlanmıştır, başka herhangi bir birimde değil. 1718400000 gibi bir değer, bir sistem veya protokol açıkça farklı bir seçim yapmadıkça her zaman 1 Ocak 1970 UTC gece yarısından bu yana geçen saniyelerdir. Zaman damgaları tasarım gereği saat diliminden bağımsızdır; bu nedenle farklı bölgelerdeki saatlerin aynı ana belirsizlik olmadan atıfta bulunması gereken günlükleme, veritabanları ve sistemler arası iletişimde kullanışlıdır.

Saniyeler, milisaniyeler ve 2038 sorunu
Pek çok modern çalışma zamanı ve API saniye yerine milisaniye kullanır. JavaScript'in Date.now() işlevi milisaniye döndürür; bu nedenle 1718400000000, saniye hassasiyetli 1718400000 değeriyle aynı andır. Tanıdık olmayan bir zaman damgası aldığınızda büyüklük birimi söyler: 10 haneli bir sayı neredeyse her zaman saniyedir; 13 haneli bir sayı neredeyse her zaman milisaniyedir. 2038 sorunu farklı bir seçimden kaynaklanır: saniye hassasiyetli bir zaman damgasını işaretli bir 32-bit tamsayıda saklamak. İşaretli bir 32-bit tamsayının maksimum değeri 2147483647'dir ve bu 2038-01-19 03:14:07 UTC'ye karşılık gelir. Bu saniyenin ardından sayaç taşar ve bunu ele almayan sistemlerde tarih 1901'e geri döner. Düzeltme 64-bit depolama kullanmaktır. Mevcut işletim sistemleri ve veritabanlarının çoğu bunu çoktan yapıyor, ancak alan genişliğini onlarca yıl önce sabitlenmiş gömülü sistemler, ağ aygıtları ve eski dosya biçimleri risk altında olmaya devam etmektedir.
Epoch'u insan tarihine dönüştürmek: saat dilimi adımı
Bir epoch değerini okunabilir tarihe dönüştürmek iki adım gerektirir: tamsayıdan UTC tarih bileşenlerini alın, ardından yerel saati elde etmek için bir UTC ofseti uygulayın. Zaman damgasının kendisi UTC'dir. 1718325000'in hangi tarihi temsil ettiğini sorduğunuzda, doğru yanıt UTC'de 2024-06-14 saat 00:30'dur. New York'ta (yazın UTC-4), aynı saniye bir önceki akşam, 2024-06-13 saat 20:30'a denk gelir: yalnızca saat değil, tarih de değişir. Bu adımın atlanması yanlış sonuçlar üretir: bir geliştirici ham zaman damgasını UTC'de kaydeder, bir raporlama aracı bunu dönüşüm yapmadan yerel saatte işler ve tarih birkaç saat veya tam bir gün kayık görünür. Sunasty'deki timestamp-converter aracı bunu açıkça ele alır: bir epoch değeri girersiniz ve araç, cihazınızın kendi yerel tarih ve saatinin yanında UTC tarih ve saatini gösterir; böylece bunun gibi bir gün sınırı geçişi bir bakışta görülebilir. Dönüşüm tamamen tarayıcıda çalışır ve yapıştırdığınız hiçbir şey cihazdan dışarı çıkmaz.

Cron sözdizimi: beş alan, aralıklar, adımlar ve listeler
Cron ifadesi, Unix benzeri sistemlerde tekrarlayan işleri zamanlar. Standart sözdizimi beş boşlukla ayrılmış alana sahiptir: dakika (0-59), saat (0-23), ayın günü (1-31), ay (1-12), haftanın günü (0-7; hem 0 hem de 7 Pazar'ı temsil eder). Alandaki yıldız (*) "her geçerli değer" anlamına gelir. 30 8 * * 1-5 ifadesi Pazartesiden Cumaya kadar 08:30'da çalışır. Aralıklar kısa çizgi kullanır: 1-5, 1, 2, 3, 4, 5 değerlerini kapsar. Listeler virgül kullanır: 1,15 birinci ve on beşinci anlamına gelir. Adımlar eğik çizgi kullanır: dakika alanındaki */15, her 15 dakikada bir (0, 15, 30, 45) anlamına gelir. Bu birleştiriciler bir arada kullanılabilir: 0-30/10, 0, 10, 20, 30 anlamına gelir. Cron'un sahip olmadığı şey bir saat dilimi alanıdır. Arka plan programı, üzerinde çalıştığı makinenin saatini okur ve bu saat, sunucunun yerel saat dilimine ayarlanmıştır. Sunucu UTC üzerinde çalışıyorsa ancak geliştirici yerel saati bekliyorsa zamanlama yanlış saat saatinde tetiklenir. Pratik kural, cron zamanlamalarını sunucu-yerel-saat ifadeleri olarak ele almak ve cron satırının yanına sunucunun saat dilimini belgelemektir.
Timestamp-converter'ı yerel olarak kullanmak
Sunasty'deki timestamp-converter iki yönde dönüştürür: epoch'tan insan tarihine ve insan tarihinden epoch'a. Saniye hassasiyetli veya milisaniye hassasiyetli bir değer girebilirsiniz; araç büyüklükten birimi algılar. Sonucu UTC'de ve cihazınızın kendi yerel saat diliminde yan yana gösterir; kopyalamaya hazır ham saniye ve milisaniye değerleriyle birlikte. Bir Şimdi düğmesi tek tıkla güncel zaman damgasını doldurur; bu, terminal açmadan güncel Unix zamanının ne olduğunu bilmek istediğinizde hızlı bir yoldur. Ayrı bir saat dilimi seçici yoktur: yerel sütun her zaman tarayıcınızın o an ayarlı olduğu saat dilimini yansıtır. Bunların tümü tarayıcıda çalışır. Alana yapıştırdığınız değer istemci taraflı JavaScript tarafından okunur ve cihazdan hiçbir zaman çıkmaz.
Bu makaledeki araçlar
- Zaman Damgası DönüştürücüUnix dönem zaman damgalarını insan tarihlerine (UTC + yerel) ve tersine dönüştürün. Saniye ile milisaniyeyi otomatik algılar.
- Tarih farkıİki tarih arasındaki gün, hafta, ay ve yılları sayın, tamamen tarayıcınızda, hiçbir şey yüklenmez.
- Cron ifadesi ayrıştırıcıBir cron ifadesini ayrıştırın ve sonraki çalışma zamanlarını önizleyin. Özel, tarayıcı içi.
Sıkça sorulan sorular
JavaScript neden saniye yerine milisaniye kullanır?
JavaScript'in Date nesnesi, başından beri saniye altı hassasiyetle çalışmak üzere tasarlandı ve milisaniyeler, ondalık nokta gerektirmeden saniyenin bin katı çözünürlük sağlar. Değiş tokuş, değerlerin daha büyük olmasıdır; bu nedenle Date.now() 13 haneli bir sayı üretirken çoğu sunucu taraflı zaman damgası 10 hanedir.
Cron çalıştıran her sunucunun UTC'de olması gerekiyor mu?
Hayır, ancak sunucuları UTC üzerinde çalıştırmak belirsizliği ortadan kaldırdığı için yaygın bir uygulamadır. Bir sunucu UTC üzerindeyken 0 2 * * * gibi bir cron ifadesi 02:00 UTC anlamına gelir ve bu saat yıl boyunca sabittir. DST uygulayan bir dilimde bulunan sunucuda ise aynı iş yaz ve kış farklı UTC anlarında tetiklenir ve saat değişim sınırında bir kez atlanabilir ya da iki kez çalışabilir.
2038 sonrası zaman damgaları için güvenli depolama türü nedir?
İşaretli bir 64-bit tamsayı, saniye hassasiyetli zaman damgalarını 292277026596 yılına kadar tutar; bu, herhangi bir pratik endişenin çok ötesindedir. Mevcut veritabanlarının çoğu zaman damgalarını varsayılan olarak 64-bit değer olarak depolar. 32-bit alanlar kullanan eski bir şema veya ikili dosya biçimiyle çalışıyorsanız, 2038 sınırından önce 64-bit depolamaya geçiş doğru düzeltmedir.