2015-04-30 5 views
0

Я пытаюсь вернуть число секунд с 1970 с функцией времени с stm32f4.Отрицательное значение, возвращаемое временем

У меня есть эти тип данных настроен

RTC_HandleTypeDef RtcHandle; 
RTC_DateTypeDef dateStruct; 
RTC_TimeTypeDef timeStruct; 

Я делаю вызов

HAL_RTC_GetTime 
HAL_RTC_GetDate 

и я называю эту функцию

long SystemClock::getUnixTimestamp() 
    struct tm timeinfo; 

    //Setup a tm structure based on the RTC 
    timeinfo.tm_wday = dateStruct.WeekDay; 
    timeinfo.tm_mon = dateStruct.Month - 1; 
    timeinfo.tm_mday = dateStruct.Date; 
    timeinfo.tm_year = dateStruct.Year + 100; 
    timeinfo.tm_hour = timeStruct.Hours; 
    timeinfo.tm_min = timeStruct.Minutes; 
    timeinfo.tm_sec = timeStruct.Seconds; 

    time_t rawtime = mktime(&timeinfo); 

    trace_printf("Current date and time are: %s\n", ctime(&rawtime)); 
    long x = time(&rawtime); 
    trace_printf("time %lu\n", x); 
    return x; 
} 

Я вижу

Current date and time are: Wed Apr 29 22:46:00 2015 
time 1430347560 

5 second later, i do another call to HAL_RTC_GetTime, HAL_RTC_GetDate, getUnixTimestamp and i get 

Current date and time are: Wed Apr 29 22:46:05 2015 
time 1430347560 

Почему время не изменяется?

+1

Просьба представить подробную информацию «если я пытаюсь отобразить». Какой код вы использовали для отображения 'rawtime'? –

+0

Значение '-1074790400' является подозрительным; это '0xbff00000' в шестнадцатеричном формате. Предполагая обычную эпоху 1970 года, значение, возвращаемое 'time (NULL)' или 'time (& rawtime)' должно быть чем-то вроде '1430445026'. Обновите свой вопрос, чтобы показать, как вы его печатаете. Что-то вроде 'printf ("% ld \ n ", (long) time (NULL));' должно работать. –

ответ

0

Из того, что я читаю, кажется, что time() может возвращать отрицательное значение: What is ultimately a time_t typedef to?

Unix и POSIX-совместимых систем реализовать тип time_t как подписал целое число (обычно 32 или 64 бита), который представляет количество секунд с момента начала эпохи Unix: полуночный UTC 1 января 1970 года (не считая секунд прыжка). Некоторые системы правильно обрабатывают отрицательные значения времени, а другие - нет. Системы, использующие 32-битный тип времени 0t, подвержены проблеме 2038 года.

Функции библиотеки time.h смогут обрабатывать эти отрицательные значения и переводить их в фактические даты. Фактически, это может быть доказано на вашем компьютере с ctime() работает отлично.

В вашей ситуации, если вам абсолютно необходимо количество секунд, вам нужно будет преобразовать/typecast значение возврата time() в длинную перед печатью.

printf("Time : %lu", (long)time(&rawtime)); 
+0

Я получаю не значение с% l .... ничего не возвращается ..... –

+0

@roberttrudel Извините, попробуйте% lu для unsigned long. – Cubia

+0

с лу, у него что-то получается, но я получаю что-то странное. я звоню, чтобы получить время, дату, отображаемое значение с помощью: ctime (& rawtime), отобразить значение с помощью вашей команды. я спал 5 секунд. я вижу изменение с помощью ctime (& rawtime), но не с вашей командой. –

1

Использование

printf("time %d\n", time(&rawtime)); 

для отображения rawtime не подходит. time_t необязательно является int.

Вот код, который я скопировал из http://en.cppreference.com/w/cpp/chrono/c/time, чтобы отобразить значение, возвращаемое time:

#include <ctime> 
#include <iostream> 

int main() 
{ 
    std::time_t result = std::time(nullptr); 
    std::cout << std::asctime(std::localtime(&result)) 
       << result << " seconds since the Epoch\n"; 
}