Kilka lat temu natknąłem się na ten plik na naszym serwerze plików.
Zastanawiam się, jak plik może powiedzieć, że został utworzony w 1641 roku? O ile mi wiadomo, czas na PC jest definiowany przez liczbę sekund od 1 stycznia 1970 roku. Jeśli ten indeks się zepsuje, możesz dostać 31 grudnia 1969 roku (indeks prawdopodobnie mówi -1), ale jestem tym zaskoczony pozornie przypadkowa data, która wyprzedza nawet powstanie Stanów Zjednoczonych Ameryki.
Jak więc można datować plik w 1641 roku?
PS: Daty są w języku francuskim. Février to luty.
filesystems
Fredy31
źródło
źródło
clock_gettime(2)
stronę podręcznika, aby uzyskać definicję tegostruct timespec
, czegostat
używają inne wywołania systemowe do przekazywania znaczników czasu między przestrzenią użytkownika a jądrem. Jest to struktura ztime_t
sekundami ilong tv_nsec
nanosekundami. W systemach 64-bitowych oba są 64-bitowe, więc cały znacznik czasu wynosi 128 bitów (16 bajtów). (Przepraszam za zbyt wiele szczegółów, dałem się ponieść emocjom.)Odpowiedzi:
Dlaczego możliwa jest data z 1600 roku?
System Windows nie przechowuje znaczników czasu modyfikacji plików, tak jak robią to systemy uniksowe . Według Windows Dev Center (moje podkreślenie):
Tak więc, ustawiając tutaj niewłaściwą wartość, możesz łatwo uzyskać daty z XVII wieku.
Oczywiście kolejnym ważnym pytaniem jest: w jaki sposób ustawiono tę wartość? Jaka jest rzeczywista data? Myślę, że nigdy nie będziesz w stanie się dowiedzieć, ponieważ mógł to być po prostu błąd obliczeniowy w sterowniku systemu plików. Inna odpowiedź zakłada hipotezę, że data jest w rzeczywistości uniksowym znacznikiem czasu interpretowanym jako znacznik czasu systemu Windows, ale w rzeczywistości są one obliczane w różnych odstępach czasu (sekundy w porównaniu do nanosekund).
Jak to się ma do problemu z 2038 r.?
Zastosowanie 64-bitowego typu danych oznacza, że na system Windows (ogólnie) nie ma wpływu problem z rokiem 2038 występujący w tradycyjnych systemach uniksowych, ponieważ Unix początkowo używał 32-bitowej liczby całkowitej, która przepełnia się wcześniej niż 64-bitowa liczba całkowita tego systemu Windows ma. (Dzieje się tak pomimo tego, że Unix działa w kilka sekund, a Windows w mikro / nanosekundach.)
Oczywiście Windows nadal ma wpływ na używanie 32-bitowych programów, które zostały skompilowane ze starszymi wersjami Visual Studio.
Nowsze systemy operacyjne Unix już rozszerzyły typ danych do 64 bitów, unikając w ten sposób problemu. (W rzeczywistości, ponieważ uniksowe znaczniki czasu działają w kilka sekund, nowa data zakończenia będzie za 292 miliardów lat.)
Jaka jest maksymalna data, którą można ustawić?
Dla ciekawskich - oto jak to obliczyć:
@corsiKa
wyjaśnia, w jaki sposób możemy odjąć lata przestępne: 29247/365/4 ≈ 20Niektórzy ludzie próbowali to ustalić i wymyślili ten sam rok.
źródło
time_t
jest to 64-bit, więc mam nadzieję, że aplikacje używajątime_t
zamiast typu całkowitego, który wciąż jest 32-bitowy i skróciłoby znaczniki czasu ... W każdym razie, gdyby ktoś był ciekawy stanu problemu, jest on w większości rozwiązany, z wyjątkiem starszej wersji 32-bitowej. IDK, jeśli 32-bitowy ARM będzie nadal odpowiedni w 2038 r., Ale wymusi to przynajmniej zmianę ABI. 32-bitowy x86 już prawie zniknął w świecie Uniksa; to tylko system Windows, w którym 32-bitowy kod jest nadal powszechny.Jeśli nie czujesz się tak źle z powodu zgadywania, pozwól, że wyjaśnię. I nie mam na myśli „ktoś ustawia wartość na nonsens”, to oczywiście zawsze możliwe :)
Czas uniksowy zwykle wykorzystuje liczbę sekund od 1970 roku. Z drugiej strony, Windows używa 1601 jako roku początkowego. Jeśli więc założymy (i to jest duże założenie!), Że problemem jest niewłaściwa konwersja między tymi dwoma czasami, możemy sobie wyobrazić, że data, która miała być reprezentowana, jest w rzeczywistości
w 2011 r. (1970 + 41), która została niepoprawnie przekonwertowana do 1640 (1601 + 41). EDYCJA: Właściwie popełniłem błąd w początkowym roku systemu Windows. Możliwe, że faktyczny czas utworzenia przypadał na 2010 r., Lub że wystąpił inny błąd (błędy indywidualne są dość powszechne w oprogramowaniu: D).Biorąc pod uwagę, że ten rok jest kolejną datą śledzenia związaną z danym plikiem, myślę, że to całkiem prawdopodobne wytłumaczenie :)
źródło
Jak napisali inni, epoka Windowsa to 1601-01-01 00:00 .
Liczba sekund między wyświetloną epoką a czasem wyświetlania wynosi 1.266.705.294 .
Jeśli dodamy to do epoki Uniksa, osiągniemy w sobotę 2010-02-20 23:34:54 CEST . Jest to około rok przed datą ostatniego dostępu, co sprawia, że jest to całkiem prawdopodobne. Być może był to uniksowy znacznik czasu interpretowany w odniesieniu do niewłaściwej epoki.
źródło
Jak zwykle w przypadku tego rodzaju pytań, blog Raymonda Chena ma na to odpowiedź z „Dlaczego epoka Win32 jest 1 stycznia 1601 roku?”. wpis od 6 marca 2009:
źródło