Karena orang-orang di sini menjawab bagaimana mengatur time_t
maksimum nilai, dan membuat tebakan lebih lanjut tentang jenisnya, saya pikir saya akan menambahkan c++
cara melakukannya:
#include <limits>
...
time_t maxTime = std::numeric_limits<time_t>::max();
Saya tidak akan terlalu peduli tentang apa yang masuk ke dalam time_t
, tetapi tentang apa yang masuk akal. Pada sistem apa pun yang pernah saya lihat, sebuah time_t
dapat menyandikan rentang waktu di mana saja dari 63 tahun hingga 10 tahun (hampir semua sistem yang saya tahu menggunakan angka 64 bit sejak para jenius ini muncul dengan hal yang akan mengakhiri dunia Y2K pada tahun 1999, masih harus dilihat siapa yang akan melihat jauh lebih besar "peristiwa" ketika tahun 2038 berlalu).
Jika Anda berharap secara wajar bahwa program Anda akan berjalan tidak lebih dari 50 tahun, tolak nilai apa pun yang lebih besar dari 50*365*86400, atau cukup penuhi nilainya. Saya tidak berharap salah satu program yang saya tulis sekarang akan digunakan dalam 50 tahun (walaupun saya tidak akan hidup untuk memverifikasi itu).
Di sisi lain, jika sistem Anda bisa gunakan time_t
32 bit , maka itu tidak masalah, karena waktu sistem akan meluap dalam 50 tahun, jadi seseorang tidak dapat membuat waktu yang berarti tanpa mengubah zaman.
Jika Anda bertanya "berapa lama Anda ingin menjeda?" dan pengguna mengatakan "250 tahun", saya akan menganggap itu bukan perilaku program yang benar-benar salah jika Anda mengatakan "ya benar, 50 juga akan berhasil". Karena, hei, perbedaannya benar-benar tidak terlihat.
Menurut Wikipedia, time_t
mungkin bilangan bulat atau titik mengambang, tetapi biasanya berupa bilangan bulat bertanda 32-bit atau 64-bit. Saya pikir nilai aman terbesar yang dapat Anda asumsikan adalah INT_MAX
. Untuk time_t
setidaknya angka negatif adalah legal dan merujuk sebelum 1 Januari 1970.
Sayangnya standar ISO C (saat ini C11) tidak menyediakan cara apapun untuk mendapatkan nilai maksimum time_t
. Jadi, kecuali seseorang menggunakan alat seperti Autoconf yang memberikan informasi, seseorang perlu membuat beberapa asumsi.
Dengan asumsi bahwa time_t
adalah tipe bilangan bulat tanpa bantalan bit (yang terjadi pada sebagian besar platform saat ini, jika tidak semua), yang mungkin dapat diambil:
(((time_t) 1 << (sizeof(time_t) * CHAR_BIT - 2)) - 1) * 2 + 1
yang merupakan nilai maksimum yang dapat diwakili untuk tipe bilangan bulat yang ditandatangani (tetapi fakta bahwa suatu nilai dapat diwakili dalam time_t
tidak berarti didukung oleh sistem sebagai time_t
nilai).
Seseorang mungkin juga ingin mendeteksi apakah time_t
adalah tipe bilangan bulat. Standar ISO C menetapkan bahwa time_t
adalah tipe nyata (Klausul 7.27.1). Menurut definisi, tipe sebenarnya adalah tipe bilangan bulat atau tipe mengambang nyata (float
, double
atau long double
, dan mungkin lainnya ditambahkan dalam versi standar yang akan datang, sebagaimana disebutkan dalam Klausul 6.11.1). Jadi, jika time_t
bukan tipe integer, itu harus tipe floating nyata. Akibatnya, seseorang dapat mendeteksi apakah time_t
adalah tipe bilangan bulat dengan pengujian (time_t) 1 / 2 == 0
.
Catatan:Standar C tidak secara ketat mengharuskan (T) 1 / 2
itu berbeda dari 0 jika T
adalah tipe mengambang, tetapi jika tidak demikian, saya menduga bahwa platform tersebut akan memiliki masalah serius dengan perhitungan titik-mengambang.