У меня есть время unix с 1 января 1970 года (например, 1531074816) с моего модуля GPS, как мне преобразовать его в читаемый формат? Мне нужно получить только текущий час, минуты и секунды. Меня не волнует день или свидание. Я тоже использую C. Спасибо.
Преобразование времени unix в удобочитаемое время
Ответы (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
Этого может быть достаточно для работы на ранчо, но это не точно, так как вы не учитываете дополнительные секунды. Вы будете ошибаться по количеству дополнительных секунд с начала эпохи - разница составляет 37 секунд на момент написания этой статьи.
- person Jabberwock; 08.07.2018
@Jabberwock Вообще-то неправда. POSIX утверждает, что значения
time_t
Unix не учитывают дополнительные секунды. Такой код гарантированно будет работать.
- person Steve Summit; 08.07.2018
@Steve Вы абсолютно правы - я понятия не имел. Спасибо.
- person Jabberwock; 08.07.2018
Оба неверны ... дополнительные секунды вставлены в UTC, чтобы компенсировать вращение Земли (на основе UTC) против отклонения TAI (атомного времени). Дополнительные секунды в некоторой степени непредсказуемы и объявляются, когда они должны быть вставлены. Они изменяют масштаб UTC, но POSIX говорит (правильно), что POSIX не принимает это во внимание. Таким образом, внутренние часы unix должны быть скорректированы вручную, чтобы компенсировать вставку секунды координации.
- person Luis Colorado; 10.07.2018
localtime
или _ 2_, если вы не хотите переходить на ваш местный часовой пояс. Затем напечатайте поля из возвращенногоstruct tm *
напрямую или позвонитеstrftime
, чтобы сделать это за вас. - person Steve Summit   schedule 08.07.2018localtime()
иgmtime()
. - person Jonathan Leffler   schedule 08.07.2018time_t
значения. GPS-приемники обычно выполняют GPStime - ›преобразование времени в UTC перед передачей времени пользователю, но очевидно, чтоtime_t
был бы плохим выбором для этого, поскольку он не может правильно отображать истинное время в формате UTC. - person Steve Summit   schedule 09.07.2018