Отображать POSIX как дату календаря без gmtime и asctime

В настоящее время у меня есть двойник, содержащий отметку времени POSIX, и я успешно использую gmtime и asctime для отображения даты календаря через структуру time_t:

    time_t input = posix;
    printf("%s",asctime(gmtime(&input)));

Это работает хорошо, за исключением (очевидно) случаев, когда время POSIX выходит за пределы библиотеки time.h (т.е. 1901-2038), и в этом случае возвращается дата в 1901 году. Существуют ли какие-либо простые альтернативы gmtime/asctime/time.h , или мне просто придется работать с необработанными цифрами?

Изменить: я должен добавить, что результат, выходящий за эти пределы, довольно вероятен, поскольку posix double является результатом вычисления, а не экземпляром текущего системного времени.


person ojk    schedule 28.12.2012    source источник
comment
Как вы ожидаете, что международный стандарт будет отображаться как календарная дата?   -  person    schedule 28.12.2012
comment
Под календарной датой я подразумеваю представление, разделенное на год, месяц, день и т. д. В приведенном выше случае, когда содержимое double posix равно 1235736569.980815, оно правильно возвращает пт, 27 февраля, 12:09:29 2009.   -  person ojk    schedule 28.12.2012
comment
Я не думаю, что существует жизнеспособная альтернатива time.h, освещающему проблему 2038 года. Вы уверены, что вам нужно охватить даты более чем через 20 лет? :)   -  person davak    schedule 28.12.2012
comment
Да, абсолютно уверен, что мне нужно охватить даты после 2038 года и до 1901 года...   -  person ojk    schedule 28.12.2012


Ответы (1)


Прочтите статью Википедии о Unix Time:

Спецификации POSIX и Open Group Unix включают стандартную библиотеку C, которая включает типы времени и функции, определенные в заголовочном файле <time.h>. Стандарт ISO C утверждает, что time_t должен быть арифметическим типом, но не предписывает для него какой-либо конкретный тип или кодировку.

Если вам нужно обрабатывать большой диапазон значений времени переносимым образом, вам, вероятно, придется использовать собственную библиотеку времени. Я не думаю, что вы даже можете рассчитывать на то, что struct tm покроет диапазон за пределами 1901–2038 годов.

Вы также можете прочитать этот ответ StackOverflow относительно time_t.

person tomlogic    schedule 28.12.2012