#c
#c
Вопрос:
-
У меня большое значение секунд. и я хочу преобразовать секунды в struct tm, но когда я использую localtime_r, он возвращает null для большого значения.
-
есть ли какой-либо способ преобразовать большое значение секунд в struct tm
или
- какое наибольшее значение я могу передать функции localtime_r, чтобы она не возвращала NULL?
#include <bits/stdc .h>
#include <map>
#include <time.h>
using namespace std;
int main ()
{
time_t seconds= 9223372036854775807;
struct tm timeResu<
struct tm *endTimeTm = localtime_r(amp;seconds, amp;timeResult);
if (!endTimeTm)cout<<"null";
else cout<<"not null";
return 0;
}
Комментарии:
1. Но это было бы примерно 292 278 994 000 года. Это примерно в 21 раз больше возраста вселенной в будущем! Вы уверены, что действительно хотите знать месяц и день недели этого
tm
?2. какое наибольшее значение секунд я могу передать функции localtime_r, чтобы она не возвращала null?
3. Ну, я думаю, это зависит от реализации. Просто для развлечения, на моей машине Linux, используя
date
инструмент, который, как я предполагаю, использует этот же вызов, и выполняя двоичный поиск, максимальное значение равно67768036191673199
, что соответствует 23:59:59 31 декабря 2147485547 года. Интересно, что в этом году точно1900 0x7fffffff
.
Ответ №1:
есть ли какой-либо способ преобразовать большое значение секунд в struct tm
Даже с 64-разрядной time_t
версией 9223372036854775807, безусловно, выходит за рамки того, что localtime_r()
можно преобразовать. .tm_year
член будет иметь слишком большое значение вне int
диапазона.
Ответ №2:
Я предполагаю, что ваш входной номер слишком огромен. Просматривая документы, вы можете видеть, что localtime_r
это возвращается NULL
в случае ошибки. О какой ошибке вы можете догадаться? Взглянув на struct *tm
(вы можете взглянуть на это в спецификации), вы сохраняете годы (которые являются «самой большой» единицей времени) в виде целого числа размером 32 бита. Но время, которое вы запрашиваете, требует log2(9223372036854775807 / 60 / 60 / 24 / 356) = 39 бит, который ваше обычное целое число не может поддерживать.
Короткий ответ: ваше time_t
целое число слишком велико.