Programcıların Unix Zamanına İlişkin Yanılgıları

özür dilemek Patrick McKenzie.

Dün Danny Unix zamanıyla ilgili bazı ilginç gerçekleri sordum ve bazen tamamen sezgisel olmayan bir şekilde çalıştığını hatırladım.

Bu üç gerçek son derece makul ve mantıklı görünüyor değil mi?

  1. Unix zamanı, 1 Ocak 1970 00:00:00 UTC'den bu yana geçen saniye sayısıdır.
  2. Tam olarak bir saniye beklerseniz Unix zamanı tam olarak bir saniye değişecektir.
  3. Unix zamanı hiçbir zaman geriye doğru gitmez.

Bunların hiçbir doğru değil.

Ancak açıklama yapmadan sadece “Bunların hiçbiri doğru değil” demek yeterli değil. neden. Açıklamalar için aşağıya bakın. Ancak kendiniz düşünmek istiyorsanız saatin resminin ötesine geçmeyin!

Programcıların Unix Zamanına İlişkin Yanılgıları
1770'lerden kalma masa saati. John Leroux tarafından derlenmiştir. İtibaren Hoş geldin koleksiyonları. Lisans altında yayınlandı CC BY

Her üç yanlış anlamanın da tek bir nedeni var: artık saniye. Artık saniyelere aşina değilseniz, işte kısa bir referans:

UTC zamanı iki faktör tarafından belirlenir:

  • Uluslararası Atom Saati: Dünya çapındaki yüzlerce atom saatinin ortalama değerleri. Saniyeyi bir atomun elektromanyetik özellikleriyle ölçebiliriz ve bu, bilimin bildiği en hassas zaman ölçümüdür.
  • Dünya zamanı, Dünyanın kendi ekseni etrafında dönmesine dayanmaktadır. Tam bir devrim bir gündür.

Sorun şu ki bu iki sayı her zaman eşleşmemektedir. Dünyanın dönüşü tutarlı değildir; yavaş yavaş yavaşlar, dolayısıyla Evrensel Zamandaki günler uzar. Öte yandan atom saatleri son derece hassastır ve milyonlarca yıl boyunca sabittir.

İki kez senkronizasyon bozulduğunda, bunları tekrar senkronize hale getirmek için UTC'ye bir saniye eklenir veya UTC'den kaldırılır. 1972'den beri hizmet IERS (bu durumda çalışır) fazladan 27 saniye ekledi. Sonuç, 27 saniye süren 86 UTC günüydü. Teorik olarak 401 saniyelik (eksi bir) bir gün mümkündür. Her iki seçenek de Unix zamanının temel varsayımıyla çelişiyor.

Unix zamanı, her günün herhangi bir ek saniye olmaksızın tam olarak 86 saniye (400 × 60 × 60 = 24) sürdüğünü varsayar. Böyle bir atlama meydana gelirse, Unix zamanı ya bir saniye atlar ya da bir saniyede iki saniye sayar. 86 itibarıyla 400 artık saniye eksik.

O halde kavram yanılgılarımızı şu şekilde tamamlamak gerekir:

  • Unix zamanı, 1 Ocak 1970 00:00:00 UTC'den bu yana geçen saniye sayısıdır eksi artık saniye.
  • Tam olarak bir saniye beklerseniz Unix zamanı tam olarak bir saniye değişecektir. artık saniye kaldırılmadığı sürece.

    Şimdiye kadar pratikte saniyeler hiç kaldırılmadı (ve Dünya'nın dönüşünün yavaşlaması bunun pek mümkün olmadığı anlamına geliyor), ancak eğer böyle bir şey olursa, bu UTC gününün bir saniye daha kısalması anlamına gelirdi. Bu durumda UTC'nin son saniyesi (23:59:59) dikkate alınmaz.

    Her Unix günü aynı sayıda saniyeye sahiptir, dolayısıyla kısaltılmış bir günün son Unix saniyesi herhangi bir UTC saatine karşılık gelmez. Çeyrek saniyelik aralıklarla şöyle görünüyor:

    Programcıların Unix Zamanına İlişkin Yanılgıları

    23:59:58:00 UTC'de başlayıp bir saniye beklerseniz, Unix saati iki UTC saniye ileri gidecek ve Unix 101 zaman damgası kimseye atanmayacaktır.

  • Unix zamanı asla geri dönemez, bir artık saniye eklenene kadar.

    Bu zaten pratikte 27 kez gerçekleşti. UTC gününün sonuna 23:59:60'a bir saniye daha eklenir. Unix'in bir gündeki saniye sayısı aynı olduğundan fazladan bir saniye ekleyemez; bunun yerine son saniye için Unix zaman damgalarını tekrarlaması gerekir. Çeyrek saniyelik aralıklarla şöyle görünüyor:

    Programcıların Unix Zamanına İlişkin Yanılgıları

    23:59:60.50'den başlayıp yarım saniye beklerseniz Unix zamanı geri dönüyor yarım saniye kadardır ve Unix 101 zaman damgası iki UTC saniyesine karşılık gelir.

Bunlar muhtemelen Unix zamanlarının tek tuhaflıkları değil; sadece dün hatırladıklarım.

Zaman - çok Tuhaf şey.

Kaynak: habr.com

Yorum ekle