2015-07-07 5 views
1

Я хотел бы добавить временные метки для измерений датчиков на встроенной системе (Raspberry Pi A + running ArchLinux). Я нашел time от time.h, но он дает мне «второе» разрешение, и мне понадобится как минимум «миллисекунды». Система будет работать в течение нескольких часов, я не беспокоюсь о длительных дрейфах.Временные метки для встроенной системы

Как я могу получить это на C++?

+0

Какую операционную систему (если таковые имеются)? –

+0

Raspberry Pi A + (armv6) running ArchLinux – Shinagan

+0

Пожалуйста, добавьте эту информацию в вопрос. –

ответ

4

Если у вас есть C++11 вы можете использовать <chrono> и <ctime> библиотеки так:

#include <ctime> 
#include <string> 
#include <chrono> 
#include <sstream> 
#include <iomanip> 
#include <iostream> 

// use strftime to format time_t into a "date time" 
std::string date_time(std::time_t posix) 
{ 
    char buf[20]; // big enough for 2015-07-08 10:06:51\0 
    std::tm tp = *std::localtime(&posix); 
    return {buf, std::strftime(buf, sizeof(buf), "%F %T", &tp)}; 
} 

std::string stamp() 
{ 
    using namespace std; 
    using namespace std::chrono; 

    // get absolute wall time 
    auto now = system_clock::now(); 

    // find the number of milliseconds 
    auto ms = duration_cast<milliseconds>(now.time_since_epoch()) % 1000; 

    // build output string 
    std::ostringstream oss; 
    oss.fill('0'); 

    // convert absolute time to time_t seconds 
    // and convert to "date time" 
    oss << date_time(system_clock::to_time_t(now)); 
    oss << '.' << setw(3) << ms.count(); 

    return oss.str(); 
} 

int main() 
{ 
    std::cout << stamp() << '\n'; 
} 

Выход:

2015-07-08 10:13:29.930 

Примечание:

Если вы хотите более высокое разрешение вы можете использовать microseconds так:

std::string stamp() 
{ 
    using namespace std; 
    using namespace std::chrono; 

    auto now = system_clock::now(); 

    // use microseconds % 1000000 now 
    auto us = duration_cast<microseconds>(now.time_since_epoch()) % 1000000; 

    std::ostringstream oss; 
    oss.fill('0'); 

    oss << date_time(system_clock::to_time_t(now)); 
    oss << '.' << setw(6) << us.count(); 

    return oss.str(); 
} 

Выход:

2015-07-08 10:20:39.454163 
0

Есть куча возможностей, доступная в файле 11 chrono заголовка C++, пожалуйста, обратитесь этой данной ссылкой

Смежные вопросы