1641'de bir dosya nasıl 'oluşturuldu'?


75

Birkaç yıl önce, dosyamızdaki bu dosyaya rastladım.

Microsoft Windows'da bir dosya özellikleri iletişim kutusunun ekran görüntüsü

Acaba bir dosya 1641'de yaratıldığını nasıl söyleyebilir? Bildiğim kadarıyla, bilgisayardaki zaman 1 Ocak 1970’ten bu yana geçen saniye sayısıyla tanımlanıyor. Eğer bu endeks parlıyorsa, 31 Aralık 1969’a ulaşabilirsin (endeks muhtemelen -1 yazıyor), ama bu konuda çok şaşırdım. Görünüşe göre rastgele bir tarih, bu Amerika Birleşik Devletleri'nin kurulmasından bile daha önce.

Peki bir dosya 1641'de nasıl tarihlenebilir?

Not: Tarihler fransızca. Février Şubat.


29
"Bildiğim kadarıyla, PC üzerindeki zaman 1 Ocak 1970'den bu yana saniye sayısı ile tanımlanır." - Olduğu sistemler için bile, 1970'den önceki tarihler, bu sayıyı (bir unix zaman damgası olarak bilinir ) negatif yaparak kolayca temsil edilir . Örneğin, unix zamanı -1000000000, 1938-04-24 22:33:20'ye karşılık gelir.
marcelm

1
@marcelm Evet, ancak mümkün olan minimum tarih 321 sınırlı tam sayı aralığı nedeniyle 1901’de.
slhck

14
@slhck: Marcel'in 64 bitlik bir zaman damgası olduğunu varsayıyor, çünkü şu anki Unix / Linux dosya sistemlerini, çekirdekleri ve kullanıcı alanı yazılımını kullanıyordu. Kullanıcı alanı ve çekirdek arasındaki zaman damgalarını iletmek için kullanılan ve diğer sistemlerin ne anlama geldiğinin tanımı için clock_gettime(2)man sayfasına bakın . Saniyede bir saniye ve bir nanosaniye olan bir yapı . 64 bit sistemlerde, her ikisi de 64 bit'tir, bu nedenle tüm zaman damgası 128 bit'dir (16 bayt). (Çok fazla ayrıntı için özür dilerim, kendimden struct timespecstattime_tlong tv_nsec
Peter Cordes

3
1600'lerde bir tarihin dosyaya nasıl damgalanabileceğine dair iyi bir cevabınız var, şimdi nasıl olduğunu düşünmenin zamanı geldi. Neler eklendiğini görmek için bu wp dosyasının içeriğine çok yakından bakardım, çünkü bunun nasıl olduğuna ışık tutabilir. Yüklü eklentilere bakardım ve hiçbirinin gölgeli olmadığını onaylarım. O dosyayı değiştirilmiş bir şey olduğunu düşünüyorum ve dosyanın değiştirildiğini ancak bir windows zamanı yerine bir unix zamanı belirtildiğini gizlemek için değiştirilmiş / oluşturulmuş tarihleri ​​el ile damgalamaya çalışıyorum.
Thomas Carlisle

2
Kral Louis XIII, Kraliyet hattının PHP'ye olan bağlılığını gösterdi mi?
Jesse Slicer

Yanıtlar:


106

1600'lerden bir tarih neden mümkün olabilir?

Windows, Unix sistemleri gibi dosya değiştirme zaman damgalarını saklamaz . Göre , Windows Dev Center (vurgu benim):

Bir dosya süresi, 1 Ocak 1601, 1601 Koordineli Evrensel Saat (UTC) 'den beri geçen 100 nanosaniye aralıkların sayısını temsil eden 64 bitlik bir değerdir . Sistem, uygulama oluştururken, erişirken ve dosyalara yazarken dosya zamanlarını kaydeder.

Yani, burada yanlış bir değer ayarlayarak, 1600'lerden kolayca tarih alabilirsiniz.

Tabii ki, bir başka önemli soru şudur: Bu değer nasıl ayarlandı? Gerçek tarih nedir? Dosya sistemi sürücüsünde bir hesaplama hatası olabileceğinden, asla öğrenemeyeceğinizi düşünüyorum. Başka bir cevap , tarihin aslında Windows zaman damgası olarak yorumlanan bir Unix zaman damgası olduğunu, ancak gerçekte farklı aralıklarla (saniye ve nanosaniye) hesaplandığını varsayıyor.

Bunun 2038 Yılı problemi ile ilgisi nedir?

64 bit veri türünün kullanılması, Windows'un (genel olarak), geleneksel Unix sistemlerinin sahip olduğu 2038 Yılı Sorunu'ndan etkilenmediği anlamına gelir; çünkü Unix başlangıçta, Windows’un 64 bit tamsayısından daha erken dolup taşan bir 32 bit tam sayı kullanmıştır. vardır. (Bu, Unix'in saniyede çalışmasına ve mikro / nanosaniyede çalışan Windows'un olmasına rağmen.)

Tabii ki Visual Studio'nun eski sürümleriyle derlenmiş 32 bit programlar kullanılırken Windows hala etkilenir .

Daha yeni Unix işletim sistemleri zaten veri tipini 64 bite genişletti , bu nedenle sorundan kaçınıldı. (Aslında, Unix zaman damgaları saniyeler içinde çalıştığından, yeni sarma tarihi bundan 292 milyar yıl olacak.)

Ayarlanabilecek maksimum tarih nedir?

Meraklı olanlar için - işte bunu nasıl hesaplayacağınız:

  • Bir 64-bit tamsayı olası değerlerin sayısı olan 2 63 1 = 9223372036854775807 - .
  • Her bir kene, 0.1 µs veya 0.0000001 s olan 100 nanosaniyeyi temsil eder.
  • Maksimum zaman aralığı 9223372036854775807 ⨉ 0,0000001 s , yani yüzlerce milyar saniye olacaktır.
  • Bir saat 3600 saniyeye, bir gün 86400 saniyeye ve bir yıl 365 güne sahip, bu nedenle yılda 86400 ⨉ 365 s = 31536000 s . Bu, elbette, yalnızca ortalama olarak, artık yılları, artık saniyeleri ya da gelecekteki postapokalipik rejimlerin kalan topraklarda dikte edebileceği herhangi bir takvim değişikliğini yok sayar.
  • 9223372036854775807 ⨉ 0.0000001 s / 31536000 s ≈ 29247 yıl
  • @corsiKaartık yılları nasıl çıkarabileceğimizi açıklıyor: 29247/365/4 ≈ 20
  • Yani, maksimum yılınız 1601 + 29247 - 20 = 30828 .

Bazı insanlar aslında bunu ayarlamaya çalıştı ve aynı yıl ile geldi.


7
Kayıt için, Unix (veya en azından Linux), 2038 problemini 64 bitlik bir yapıya sahip 64 bitlik mimarilerde çekirdek / dosya sistemleri için çözmüştür time_t, bu yüzden umarım uygulamalar time_thala 32-bit ve zaman damgalarını keserdi ... Her neyse, herhangi birinin sorunun durumunu merak etmesi durumunda, eski 32 bit dışında çoğunlukla çözüldü. Eğer 32-bit ARM 2038'de hala geçerliyse IDK, ancak bu en azından bir ABI değişikliğini zorlar. 32 bit x86, Unix dünyasında hemen hemen gitti; 32 bit kodun hala yaygın olduğu yalnızca Windows.
Peter Cordes

Yorumlar uzun tartışmalar için değildir; bu konuşma sohbete taşındı .
Journeyman Geek

1
VMS zamanı, " 17-Kas-1858'den bu yana geçen 100-nanosaniye aralıkların sayısını temsil eden 64-bit bir değerdir ". :)
RonJohn

Yıl 30k ... şaşırtıcı derecede düşük
John Dvorak

2
@DonaldDuck blogs.msdn.microsoft.com/oldnewthing/20090306-00/?p=18913 ve yaklaşık 1600 kişi, daha karmaşık olandan önceki herhangi bir tarihi temsil etmek için Julian takvimini kullanıyordu.
Maciej

16

Bazı tahminler için fazla üzülmüyorsanız, bir açıklama yapmama izin verin. Ve demek istediğim "birileri değeri saçma saptamak", bu kesinlikle her zaman mümkün :)

Unix, genellikle 1970'ten bu yana geçen saniye sayısını kullanır. Öte yandan Windows, başlangıç ​​yılı olarak 1601'i kullanır. Dolayısıyla, sorunun iki kez arasında yanlış bir dönüşüm olduğunu varsayıyorsak (ve bu büyük bir varsayım!) Varsa, tahmin edilmesi gereken tarihin 2011'de (1970 + 41) yanlış bir şekilde dönüştürüldüğünü hayal edebiliriz. ila 1640 (1601 + 41) . EDIT: Aslında, Windows başlangıç ​​yılında bir hata yaptım. Gerçek oluşturma zamanının 2010'da olması ya da başka bir hata olması mümkündür (off-by-one hataları yazılımda oldukça yaygındır: D).

Bu yıl, söz konusu dosyayla ilişkili izleme tarihlerinden biri olduğu göz önüne alındığında, bunun oldukça makul bir açıklama olduğunu düşünüyorum :)


Yani tarih Unix'te yazılmış olabilir, ancak UTC'de okunur mu?
Fredy31

Windows, 1600 değil, 1601 kullanır.
Joey,

3
Bu teori ile ilgili birkaç sorun: Ekran görüntüsüne göre, dosya en son erişilişinden 11 gün sonra oluşturulacaktı . Ayrıca, Windows zaman damgaları 100 nanosaniye olarak sayılırken, UNIX süresi saniye cinsindendir.
Nolonar

2
@Joey Ugh, benim hatam. Bu, ilk bakışta uyumu çok daha kötü kılıyor :) Aynı temel fikrin hala çalışması gerektiğini düşünüyorum, ancak sandığımdan daha fazla hata var. Veya, elbette, dosya 2010'da değil, 2011'de oluşturuldu.
Luaan

2
Windows dönemi ile gösterilen dosya tarihi / saati arasındaki saniye değeri 1.266.705.294'tür . Unix dönemine eklendiğinde , bu bir Cumartesi olan 2010-02-20 23:34:54 CEST'i veriyor .
SQB

5

Başkaları tarafından yazıldığı gibi, Windows dönemi 1601-01-01 00:00 'de .

Bu çağ ile görüntülenen dosya süresi arasındaki saniye sayısı , 1.266.705.294'tür .
Bunu Unix dönemine eklersek , 2010-02-20 23:34:54 CEST , Cumartesi günü geliriz . Bu, son erişim tarihinden bir yıl kadar önce gerçekleşir ve bu durum biraz makul olur. Bu yüzden yanlış döneme karşı yorumlanmış bir Unix zaman damgası olabilir.


Garip bir şekilde, .NET dönemi 0001-01-01 00:00 UTC'dir (1600 yıl önceki). Bkz msdn.microsoft.com/en-us/library/...
Nayuki

2

Bu tür sorular için her zaman olduğu gibi, Raymond Chen'in blogunda "Win32 niçin 1 Ocak 1601? 6 Mart 2009'dan itibaren giriş:

FILETIMEYapı 1 Ocak beri 100 nanosecond aralıklarla şeklinde saatini kaydeder, 1601. Bu neden tarih seçildi?

Gregoryen takvimi, 400 yıllık bir döngüde çalışır ve 1601, Windows NT'nin tasarlandığı sırada etkin olan döngünün ilk yılıdır. Başka bir deyişle matematiğin güzel bir şekilde ortaya çıkması için seçildi.

Aslında Dave Cutler’den e-postayı aldım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.