Подтвердить что ты не робот

Как распечатать текущее время (с миллисекундами) с помощью С++/С++ 11

В настоящее время я использую этот код

string now() {
    time_t t = time(0);
    char buffer[9] = {0};

    strftime(buffer, 9, "%H:%M:%S", localtime(&t));
    return string(buffer);
}

для форматирования времени. Мне нужно добавить миллисекунды, поэтому выход имеет формат: 16:56:12.321

4b9b3361

Ответ 1

Вы можете использовать Boost Posix Time.

Вы можете использовать boost::posix_time::microsec_clock::local_time() для получения текущего времени из часов с разрешением микросекунд:

boost::posix_time::ptime now = boost::posix_time::microsec_clock::local_time();

Затем вы можете вычислить временное смещение в текущий день (так как ваш выход длительности находится в форме <hours>:<minutes>:<seconds>.<milliseconds>, я предполагаю, что они рассчитаны как смещение текущего дня, а если нет, не стесняйтесь использовать другую отправную точку для продолжительность/интервал времени):

boost::posix_time::time_duration td = now.time_of_day();

Затем вы можете использовать .hours(), .minutes(), .seconds() accessors, чтобы получить соответствующие значения.
К сожалению, не существует аксессуар .milliseconds(), но есть .total_milliseconds() one; поэтому вы можете сделать небольшую математическую вычитание, чтобы получить оставшиеся миллисекунды, которые будут отформатированы в строке.

Затем вы можете использовать sprintf() (или sprintf()_s, если вас интересует не переносимый код только для VС++), чтобы отформатировать эти поля в буфере raw char и безопасно обернуть этот необработанный буфер строки C в удобный пример std::string.

Подробнее см. комментарий ниже.

Вывод в консоли - это что-то вроде:

11: 43: 52,276


Пример кода:

///////////////////////////////////////////////////////////////////////////////

#include <stdio.h>      // for sprintf()

#include <iostream>     // for console output
#include <string>       // for std::string

#include <boost/date_time/posix_time/posix_time.hpp>


//-----------------------------------------------------------------------------
// Format current time (calculated as an offset in current day) in this form:
//
//     "hh:mm:ss.SSS" (where "SSS" are milliseconds)
//-----------------------------------------------------------------------------
std::string now_str()
{
    // Get current time from the clock, using microseconds resolution
    const boost::posix_time::ptime now = 
        boost::posix_time::microsec_clock::local_time();

    // Get the time offset in current day
    const boost::posix_time::time_duration td = now.time_of_day();

    //
    // Extract hours, minutes, seconds and milliseconds.
    //
    // Since there is no direct accessor ".milliseconds()",
    // milliseconds are computed _by difference_ between total milliseconds
    // (for which there is an accessor), and the hours/minutes/seconds
    // values previously fetched.
    //
    const long hours        = td.hours();
    const long minutes      = td.minutes();
    const long seconds      = td.seconds();
    const long milliseconds = td.total_milliseconds() -
                              ((hours * 3600 + minutes * 60 + seconds) * 1000);

    //
    // Format like this:
    //
    //      hh:mm:ss.SSS
    //
    // e.g. 02:15:40:321
    //
    //      ^          ^
    //      |          |
    //      123456789*12
    //      ---------10-     --> 12 chars + \0 --> 13 chars should suffice
    //  
    // 
    char buf[40];
    sprintf(buf, "%02ld:%02ld:%02ld.%03ld", 
        hours, minutes, seconds, milliseconds);

    return buf;
}

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

///////////////////////////////////////////////////////////////////////////////

Ответ 2

Не тратьте свое время на Boost (я знаю, что многие будут оскорблены этим утверждением и считают это ересью).

Это обсуждение содержит два очень эффективных решения, которые не требуют от вас порабощения нестандартными, сторонними библиотеками.

С++ Получение миллисекундного времени на Linux - clock() не работает должным образом

http://linux.die.net/man/3/clock_gettime

Ссылки на gettimeofday можно найти здесь, на opengroup.org

Ответ 3

Вы можете использовать boost::posix_time. См. Этот вопрос SO. Пример:

boost::posix_time::time_duration diff = tick - now;
diff.total_milliseconds();

Чтобы получить текущее время:

boost::posix_time::ptime t1 = boost::posix_time::microsec_clock::local_time();
// ('tick' and 'now' are of the type of 't1')

Вы также можете использовать С++ 11 chrono, если вы можете использовать С++ 11. Пример:

int elapsed_milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(end-start).count();

Чтобы получить текущее время (у вас есть несколько разных часов, см. документ):

std::chrono::time_point<std::chrono::system_clock> t2;
t2 = std::chrono::system_clock::now();
// ('start' and 'end' are of the type of 't2')

За время в миллисекундах вы можете получить продолжительность между полуночью и текущим временем. Пример с std:: chrono:

unsigned int millis_since_midnight()
{
    // current time
    std::chrono::time_point<std::chrono::system_clock> now = std::chrono::system_clock::now();

    // get midnight
    time_t tnow = std::chrono::system_clock::to_time_t(now);
    tm *date = std::localtime(&tnow);
    date->tm_hour = 0;
    date->tm_min = 0;
    date->tm_sec = 0;
    auto midnight = std::chrono::system_clock::from_time_t(std::mktime(date));

    // number of milliseconds between midnight and now, ie current time in millis
    // The same technique can be used for time since epoch
    return std::chrono::duration_cast<std::chrono::milliseconds>(now - midnight).count();
}

Ответ 4

Я бы рекомендовал использовать Boost.Chrono вместо библиотеки Boost.Datetime, потому что Chrono стал частью С++ 11. Примеры здесь