Преобразование времени unix в удобочитаемое время

У меня есть время unix с 1 января 1970 года (например, 1531074816) с моего модуля GPS, как мне преобразовать его в читаемый формат? Мне нужно получить только текущий час, минуты и секунды. Меня не волнует день или свидание. Я тоже использую C. Спасибо.


person Joe    schedule 08.07.2018    source источник
comment
Позвоните по телефону localtime или _ 2_, если вы не хотите переходить на ваш местный часовой пояс. Затем напечатайте поля из возвращенного struct tm * напрямую или позвоните strftime, чтобы сделать это за вас.   -  person Steve Summit    schedule 08.07.2018
comment
Не могу найти дубликат на SO, но см. c-faq.com/lib/curtime.html.   -  person Steve Summit    schedule 08.07.2018
comment
Вам нужно будет беспокоиться о том, включает ли полученное значение дополнительные секунды и обрабатывает ли используемая вами библиотека дополнительные секунды. Но помимо этой (не совсем тривиальной) проблемы, ответом являются localtime() и gmtime().   -  person Jonathan Leffler    schedule 08.07.2018
comment
@JonathanLeffler Если вы не знаете чего-то, чего я не знаю, я бы с уверенностью заверил любого обычного программиста приложений Unix / Linux, что им не нужно беспокоиться об этом - практически гарантировано, что (а) time_t значения, которые они имеют, не включают дополнительные секунды, и (б) библиотека, которую они используют, также не обрабатывает дополнительные секунды. (Так что им нужно беспокоиться только в том случае, если им нужна правильная обработка секунды координации, и в этом случае им, вероятно, не повезло.)   -  person Steve Summit    schedule 09.07.2018
comment
@SteveSummit: информация поступает с GPS-приемника. Я согласен с большинством других источников. GPS мог быть другим.   -  person Jonathan Leffler    schedule 09.07.2018
comment
@JonathanLeffler Ах, хорошее замечание. Мне тоже было интересно об этом. Я никогда не слышал о приемнике или библиотеке GPS, которые выводят time_t значения. GPS-приемники обычно выполняют GPStime - ›преобразование времени в UTC перед передачей времени пользователю, но очевидно, что time_t был бы плохим выбором для этого, поскольку он не может правильно отображать истинное время в формате UTC.   -  person Steve Summit    schedule 09.07.2018


Ответы (3)


использовать gmtime

#include <stdio.h>
#include <time.h>

int main()
{
    static const time_t unixtimestamp = 1230728833;
    struct tm *tmp = gmtime(&unixtimestamp);


    printf("%02d:%02d:%02d\n", tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
    return 0;
}
person ergesto    schedule 08.07.2018

Как говорит Стив Саммит, самым быстрым и простым является использование localtime ():

void show_time (time_t time_from_gps)
{
    struct tm *timmay;

    timmay = localtime(&time_from_gps);
    printf("%02d:%02d:%02d\n", timmay->tm_hour, timmay->tm_min, timmay->tm_sec);
}

Вы действительно не хотите пытаться катить свое собственное время. Время усложняется, а жизнь становится намного проще, если вы позволите libc справиться со всеми сложностями за вас.

person Jabberwock    schedule 08.07.2018

Если вы не хотите использовать какой-либо сторонний код, вы можете выполнить следующие действия: Сначала вы должны избавиться от всех дней с 1970 года с помощью оператора по модулю. Тогда у вас будут секунды, прошедшие с начала текущего дня. Вы можете рассчитать, сколько часов прошло, используя это число. При таком же подходе вы можете получить минуты и секунды.

Если ваша временная метка указана в секундах. Потом:

long currentTime;
long oneDay = 24L * 60 * 60;
long oneHour = 60 * 60;
long oneMinute = 60;

long currentDaySeconds = currentTime % oneDay;
long currentHour = currentDaySeconds / oneMinute;
long currentMinute = (currentDaySeconds % oneHour) / oneMinute;
long currentSeconds = currentDaySeconds % oneMinute;
person Arda Kara    schedule 08.07.2018
comment
Этого может быть достаточно для работы на ранчо, но это не точно, так как вы не учитываете дополнительные секунды. Вы будете ошибаться по количеству дополнительных секунд с начала эпохи - разница составляет 37 секунд на момент написания этой статьи. - person Jabberwock; 08.07.2018
comment
@Jabberwock Вообще-то неправда. POSIX утверждает, что значения time_t Unix не учитывают дополнительные секунды. Такой код гарантированно будет работать. - person Steve Summit; 08.07.2018
comment
@Steve Вы абсолютно правы - я понятия не имел. Спасибо. - person Jabberwock; 08.07.2018
comment
Оба неверны ... дополнительные секунды вставлены в UTC, чтобы компенсировать вращение Земли (на основе UTC) против отклонения TAI (атомного времени). Дополнительные секунды в некоторой степени непредсказуемы и объявляются, когда они должны быть вставлены. Они изменяют масштаб UTC, но POSIX говорит (правильно), что POSIX не принимает это во внимание. Таким образом, внутренние часы unix должны быть скорректированы вручную, чтобы компенсировать вставку секунды координации. - person Luis Colorado; 10.07.2018