GNU/Linux >> Belajar Linux >  >> Linux

Konversi stempel waktu Unix 64-bit

Anda membutuhkan:

typedef long long time64_t; 
time64_t mktime64(struct tm *t); 
struct tm* localtime64_r(const time64_t* t, struct tm* p);

Awalnya (pada tahun 2011) jawaban ini berisi tautan ke 2038bug.com yang memungkinkan untuk mengunduh pivotal_gmtime_r kecil perpustakaan, yang berisi fungsi-fungsi yang disebutkan. Pustaka telah dihapus dari 2038bug.com saat itu, tautan menjadi rusak dan dihapus dari jawaban oleh moderator. Sepertinya itu pivotal_gmtime_r kode sekarang dapat ditemukan di sini:

https://github.com/franklin373/mortage/tree/master/time_pivotal

Selain itu, saya menemukan pustaka lain yang lebih baru, bernama y2038 , yang juga mengimplementasikan mktime64 dan localtime64_r :

https://github.com/evalEmpire/y2038


Fungsi mengonversi struct tm* ke time_t adalah mktime . Anda dapat menemukan banyak implementasinya, mis. di Glibc dan di mktime.c libvxc mengajukan. Anda dapat mengambil kodenya (dengan asumsi itu legal untuk Anda, jadi harap hormati lisensinya) dan ubah time_t ke bilangan bulat 64 bit seperti int64_t .

Fungsi melakukan konversi lain dari time_t ke struct tm* adalah localtime atau gmtime dan Anda dapat melakukan hal yang sama.

Namun, Anda mungkin memiliki masalah yang lebih mendasar:mesin 32 bit Anda yang berjalan pada tahun 2040 seharusnya memiliki cara untuk memberi Anda waktu saat ini (sebagai time panggilan sistem tidak) dengan tepat dalam varian 64 bit dari time_t , dan itu jauh lebih sulit (bergantung pada kernel dan perangkat kerasnya).


Anda tampaknya membuat asumsi bahwa time_t adalah 32-bit pada sistem 32-bit, dan ini mungkin benar atau mungkin tidak benar.

Di Windows, dimulai dengan Visual Studio 2005 ukuran time_t adalah 64-bit, bahkan saat Anda mengompilasi untuk Windows 32-bit.

Bagian yang disayangkan adalah glibc mendefinisikannya sebagai long int , yang pada sistem 32-bit adalah bilangan bulat 32-bit. Artinya, Linux 32-bit dan platform 32-bit lainnya yang berbasis gcc/glibc (seperti Cygwin) tidak akan dapat bekerja dengan stempel waktu 64-bit.

Jika aplikasi Anda harus berjalan pada glibc 32-bit, maka Anda harus menggunakan fungsi konversi Anda sendiri, yang bisa jadi merupakan fungsi yang sama di pustaka C yang dikompilasi ulang untuk menggunakan stempel waktu 64-bit.

Jika Anda memerlukan kode sumber dengan lisensi permisif (BSD), Anda dapat melihat fungsi-fungsi ini di minix3. Ini waktu setempat. Sumbernya memiliki hyperlink, sehingga Anda dapat menemukan yang lain dengan mudah.


Linux
  1. Cara Menambahkan Stempel Waktu ke Output Perintah Unix Vmstat

  2. Menautkan perpustakaan 32-bit ke program 64-bit

  3. Cara mengonversi DATE ke UNIX TIMESTAMP dalam skrip shell di MacOS

  1. Instal Ubuntu 64-bit atau 32-bit?

  2. Bagaimana cara menentukan bitness perangkat keras dan OS?

  3. Mode operasi CPU 32-bit, 64-bit di Linux

  1. Ruang alamat proses 32-bit di linux 64-bit

  2. Apakah ada cara untuk mendapatkan time_t 64-bit dalam program 32-bit di Linux?

  3. Jalankan aplikasi 64-bit pada sistem Ubuntu 32-bit