localtime_r возвращает null для большого числа

#c

#c

Вопрос:

  1. У меня большое значение секунд. и я хочу преобразовать секунды в struct tm, но когда я использую localtime_r, он возвращает null для большого значения.

  2. есть ли какой-либо способ преобразовать большое значение секунд в struct tm

или

  1. какое наибольшее значение я могу передать функции 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 целое число слишком велико.