Beberapa tahun yang lalu, saya menemukan file ini di server file kami.
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.
filesystems
Fredy31
sumber
sumber
clock_gettime(2)
halaman manual untuk definisistruct timespec
, yang digunakan oleh apastat
dan panggilan sistem lainnya untuk memberikan cap waktu antara ruang-pengguna dan kernel. Ini adalah struct dengantime_t
dalam detik, danlong tv_nsec
nanodetik. Pada sistem 64-bit, keduanya 64-bit, sehingga seluruh timestamp adalah 128 bit (16 byte). (Maaf karena terlalu banyak detail, saya terbawa suasana.)Jawaban:
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):
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:
@corsiKa
menjelaskan bagaimana kita dapat mengurangi tahun kabisat: 29247/365/4 ≈ 20Beberapa orang sebenarnya telah mencoba untuk mengatur ini dan muncul pada tahun yang sama.
sumber
time_t
jenis 64-bit, jadi semoga aplikasi menggunakantime_t
bukan 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.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 :)
sumber
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.
sumber
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:
sumber