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.