Bagaimana sebuah file dapat 'dibuat' pada tahun 1641?

75

Beberapa tahun yang lalu, saya menemukan file ini di server file kami.

Cuplikan layar dialog properti file di Microsoft Windows

Dan saya bertanya-tanya bagaimana mungkin sebuah file mengatakan itu dibuat pada tahun 1641? Sejauh yang saya tahu, waktu di pc didefinisikan oleh jumlah detik sejak 1 Januari 1970. Jika indeks itu hilang, Anda bisa mendapatkan 31 Desember 1969 (indeks mungkin mengatakan -1) tapi saya bingung dengan ini tampaknya tanggal acak, yang bahkan mendahului berdirinya Amerika Serikat.

Jadi bagaimana mungkin sebuah file diberi tanggal pada tahun 1641?

PS: Tanggal di Perancis. Février adalah bulan Februari.

Fredy31
sumber
29
"Sejauh yang saya tahu, waktu di pc ditentukan oleh jumlah detik sejak 1 Januari 1970." - Bahkan untuk sistem di mana itu, tanggal sebelum tahun 1970 dengan mudah diwakili dengan membuat angka itu (dikenal sebagai cap waktu unix ) negatif. Misalnya, waktu unix -1000000000 sesuai dengan 1938-04-24 22:33:20.
marcelm
1
@marcelm Ya, tetapi tanggal minimum yang mungkin ada pada tahun 1901 karena kisaran terbatas dari bilangan bulat 32-bit.
slhck
14
@ Slhck: Saya pikir marcelm mengasumsikan timestamp 64-bit, karena itulah yang saat ini menggunakan sistem file Unix / Linux, kernel, dan perangkat lunak ruang pengguna. Lihat clock_gettime(2)halaman manual untuk definisi struct timespec, yang digunakan oleh apa statdan panggilan sistem lainnya untuk memberikan cap waktu antara ruang-pengguna dan kernel. Ini adalah struct dengan time_tdalam detik, dan long tv_nsecnanodetik. Pada sistem 64-bit, keduanya 64-bit, sehingga seluruh timestamp adalah 128 bit (16 byte). (Maaf karena terlalu banyak detail, saya terbawa suasana.)
Peter Cordes
3
Anda mendapat jawaban yang bagus tentang bagaimana tanggal di tahun 1600-an dapat dicap ke file, sekarang saatnya untuk merenungkan bagaimana hal itu terjadi. Saya akan melihat isi file wp itu dengan sangat dekat untuk melihat apa yang mungkin telah ditambahkan, karena itu mungkin menjelaskan bagaimana hal itu terjadi. Saya akan melihat plugin yang diinstal dan memvalidasi tidak ada yang teduh. Saya berpikir sesuatu memodifikasi file itu dan mencoba mencap tanggal yang dimodifikasi / dibuat secara manual untuk menyembunyikan bahwa file itu dimodifikasi tetapi ditentukan waktu unix bukan waktu windows.
Thomas Carlisle
2
Raja Louis XIII yang Adil menunjukkan komitmen garis kerajaan terhadap PHP?
Jesse Slicer

Jawaban:

106

Mengapa tanggal dari tahun 1600-an dimungkinkan?

Windows tidak menyimpan cap waktu modifikasi file seperti yang dilakukan sistem Unix . Menurut Windows Dev Center (penekanan saya):

Waktu file adalah nilai 64-bit yang mewakili jumlah interval 100 nanodetik yang telah berlalu sejak 12:00 AM 1 Januari 1601 Coordinated Universal Time (UTC). Sistem mencatat waktu file saat aplikasi membuat, mengakses, dan menulis ke file.

Jadi, dengan menetapkan nilai yang salah di sini, Anda dapat dengan mudah mendapatkan tanggal dari tahun 1600-an.

Tentu saja, pertanyaan penting lainnya adalah: bagaimana nilai ini ditetapkan? Tanggal berapa sebenarnya? Saya pikir Anda tidak akan pernah bisa mengetahuinya, karena itu bisa saja kesalahan perhitungan dalam driver sistem file. Jawaban lain berhipotesis bahwa tanggal itu sebenarnya cap waktu Unix diartikan sebagai cap waktu Windows, tetapi mereka sebenarnya dihitung pada interval yang berbeda (detik vs nanodetik).

Bagaimana hubungannya dengan masalah Tahun 2038?

Penggunaan tipe data 64-bit berarti bahwa Windows (umumnya) tidak terpengaruh oleh Masalah Tahun 2038 yang dimiliki sistem Unix tradisional, karena Unix awalnya menggunakan integer 32-bit, yang meluap lebih cepat daripada integer 64-bit yang dimiliki Windows telah. (Ini meskipun Unix beroperasi pada detik dan Windows beroperasi pada mikro / nanodetik.)

Windows masih terpengaruh ketika menggunakan program 32-bit yang dikompilasi dengan versi lama dari Visual Studio, tentu saja.

Sistem operasi Unix yang lebih baru telah memperluas tipe data menjadi 64 bit, sehingga menghindari masalah. (Faktanya, sejak cap waktu Unix beroperasi dalam hitungan detik, tanggal sampul baru akan menjadi 292 miliar tahun dari sekarang.)

Berapa tanggal maksimum yang bisa ditetapkan?

Untuk yang penasaran - inilah cara menghitungnya:

  • The jumlah kemungkinan nilai dalam integer 64-bit adalah 2 63 - 1 = 9223372036854775807 .
  • Setiap centang mewakili 100 nanodetik, yaitu 0,1 μs atau 0,0000001 dtk.
  • Rentang waktu maksimum adalah 9223372036854775807 ⨉ 0,0000001 s , jadi ratusan miliar detik.
  • Satu jam memiliki 3600 detik, satu hari memiliki 86400 detik, dan satu tahun memiliki 365 hari, jadi ada 86400 ⨉ 365 s = 31536000 d dalam setahun. Ini, tentu saja, hanya rata-rata, mengabaikan tahun kabisat, detik kabisat, atau perubahan kalender apa pun yang mungkin diperintahkan oleh rezim postapocalyptic di masa depan terhadap penduduk dunia yang tersisa.
  • 9223372036854775807 ⨉ 0,0000001 s / 31536000 s ≈ 29247 tahun
  • @corsiKamenjelaskan bagaimana kita dapat mengurangi tahun kabisat: 29247/365/4 ≈ 20
  • Jadi tahun maksimum Anda adalah 1601 + 29247 - 20 = 30828 .

Beberapa orang sebenarnya telah mencoba untuk mengatur ini dan muncul pada tahun yang sama.

slhck
sumber
7
Sebagai catatan, Unix (atau setidaknya Linux) telah memecahkan masalah 2038 untuk kernel / sistem file pada arsitektur 64-bit di mana time_tjenis 64-bit, jadi semoga aplikasi menggunakan time_tbukan tipe integer yang masih 32-bit dan akan memotong stempel waktu ... Pokoknya, kalau-kalau ada yang ingin tahu tentang status masalah, sebagian besar diselesaikan kecuali warisan 32-bit. IDK jika ARM 32-bit masih relevan pada tahun 2038, tetapi ini akan memaksa setidaknya perubahan ABI. 32-bit x86 sudah hilang di dunia Unix; hanya Windows yang kode 32-bitnya masih umum.
Peter Cordes
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Journeyman Geek
1
Waktu VMS adalah " nilai 64-bit yang mewakili jumlah interval 100 nanodetik yang telah berlalu sejak " 17-Nov-1858. :)
RonJohn
Tahun 30k adalah ... sangat rendah
John Dvorak
2
@DonaldDuck blogs.msdn.microsoft.com/oldnewthing/20090306-00/?p=18913 dan sekitar 1600 orang masih menggunakan Julian pembuatan kalender representasi dari tanggal sebelum yang lebih rumit.
Maciej Piechotka
16

Jika Anda tidak merasa terlalu buruk tentang beberapa dugaan, izinkan saya menawarkan penjelasan. Dan saya tidak bermaksud "seseorang menetapkan nilai menjadi omong kosong", itu jelas selalu mungkin :)

Waktu Unix biasanya menggunakan jumlah detik sejak 1970. Windows, di sisi lain, menggunakan 1601 sebagai tahun awalnya. Jadi jika kita berasumsi (dan itu asumsi besar!) Bahwa masalahnya adalah salah konversi antara dua kali, kita dapat membayangkan bahwa tanggal yang seharusnya diwakili sebenarnya sekitar tahun 2011 (1970 + 41), yang dikonversi secara salah ke 1640 (1601 + 41) . EDIT: Sebenarnya, saya membuat kesalahan di awal tahun Windows. Ada kemungkinan bahwa waktu pembuatan yang sebenarnya adalah pada tahun 2010, atau bahwa ada kesalahan lain yang terlibat (kesalahan satu per satu cukup umum pada perangkat lunak: D).

Mengingat tahun ini kebetulan merupakan salah satu dari tanggal pelacakan yang terkait dengan file tersebut, saya pikir ini adalah penjelasan yang cukup masuk akal :)

Luaan
sumber
Jadi bisa jadi tanggalnya ditulis dalam Unix, tetapi dibaca dalam UTC?
Fredy31
Windows menggunakan 1601, bukan 1600.
Joey
3
Beberapa masalah dengan teori itu: Menurut tangkapan layar, file tersebut akan dibuat 11 hari setelah diakses terakhir kali. Juga, cap waktu Windows dihitung dalam 100 nanodetik, sedangkan waktu UNIX dalam detik.
Nolonar
2
@ Joey Ugh, kesalahan saya. Itu membuat cocok jauh lebih buruk daripada pada pandangan pertama :) Saya pikir ide dasar yang sama masih berfungsi, tetapi mungkin ada lebih banyak kesalahan yang terlibat daripada yang saya duga. Atau, tentu saja, file itu dibuat pada 2010, bukan 2011.
Luaan
2
Detik antara zaman Windows dan tanggal / waktu file yang ditampilkan adalah 1.266.705.294 . Ketika ditambahkan ke zaman Unix, ini menghasilkan 2010-02-20 23:34:54 CEST , yang merupakan hari Sabtu.
SQB
5

Seperti yang telah ditulis oleh orang lain, zaman Windows berada di 1601-01-01 00:00 .

Jumlah detik antara zaman itu dan masa pakai film yang ditampilkan, adalah 1.266.705.294 .
Jika kita menambahkan itu ke zaman Unix, kita tiba di 2010-02-20 23:34:54 CEST , hari Sabtu. Ini sekitar satu tahun sebelum tanggal akses terakhir, yang membuatnya agak masuk akal. Jadi itu mungkin cap waktu Unix ditafsirkan terhadap zaman yang salah.

SQB
sumber
Anehnya, zaman .NET adalah 0001-01-01 00:00 UTC (yang 1.600 tahun sebelumnya). Lihat msdn.microsoft.com/en-us/library/…
Nayuki
2

Seperti biasa untuk jenis pertanyaan ini, blog Raymond Chen memiliki jawaban mengenai hal ini dari "Mengapa zaman Win32 1 Januari 1601?" entri dari 6 Maret 2009:

The FILETIMEStruktur mencatat waktu dalam bentuk interval 100-nanosecond sejak 1 Januari 1601. Mengapa tanggal tersebut dipilih?

Kalender Gregorian beroperasi pada siklus 400 tahun, dan 1601 adalah tahun pertama siklus yang aktif pada saat Windows NT dirancang. Dengan kata lain, dipilih untuk membuat matematika keluar dengan baik.

Saya sebenarnya punya email dari Dave Cutler untuk mengonfirmasi hal ini.

ErikF
sumber