Вопрос по c++ – получить миллисекунду часть времени

11

Мне нужно получить миллисекунды от таймера

    // get timer part
    time_t timer = time(NULL);
    struct tm now = *localtime( &timer );
    char timestamp[256];

    // format date time
    strftime(timestamp, sizeof(timestamp), "%Y-%m-%d_%H.%M.%S", &now);

Я хочу получить это в C #:

DateTime.Now.ToString("yyyy-MM-dd_HH.mm.ss.ff")

Я пытался использовать% f или% F, но он работает с C ++. как я могу получить% f за миллисекунды от тм?

заранее спасибо

Для Unix, проверьте мой заимствованныйclass что я отправил другой ответ здесь, на SO. Вы можете разобрать его, чтобы получить миллисекунды. Drise
time() возвращаетinteger количество секунд с начала эпохи. Таким образом, очевидно, что вы не можете получить точность ниже секунды, используя ее. использованиеgettimeofday() вместо. Hristo Iliev
Это должно работать только на Windows или это кросс-платформенный? tinman

Ваш Ответ

8   ответов
3

Вы можетеboost::posix_time::ptime учебный класс. этоссылка там.

я не хочу получать зависимость библиотеки Boost только из-за использования таймера olidev
16
#include <chrono>

typedef std::chrono::system_clock Clock;

auto now = Clock::now();
auto seconds = std::chrono::time_point_cast<std::chrono::seconds>(now);
auto fraction = now - seconds;
time_t cnow = Clock::to_time_t(now);

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

auto milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(fraction);
std::cout << milliseconds.count() << '\n';
Насколько я могу сказать, вы не можете напрямую подать заявкуduration_cast в моменты времени.
Это подход C ++ 11
@KyleStrand Вы правы. Я опубликовал исправление.
Посмотрев немного больше на это, я думаю, что вы ищетеtime_point_cast.
1

ime (_ftime_s). Извлекает структуру _timeb (_ftime64), содержащую структуру time_t, а также миллисекунды, см. MSDNhttp://msdn.microsoft.com/en-/library/z54t9z5f.aspx

#include <sys/timeb.h>

struct _timeb timebuffer;
_ftime(&timebuffer);
timebuffer.millitm; //milli seconds
timebuffer.time; //the same like struct time_t
5
Ссылка не работает.
Пожалуйста, суммируйте код здесь.
Ссылка в порядке с 2018-05-16. Показанный код сильно неисправен. Он состоит из 4 заголовков иint main(void) { char buffer[30]; struct timeval tv; time_t curtime; gettimeofday(&tv, NULL); curtime=tv.tv_sec; strftime(buffer,30,"%m-%d-%Y %T.",localtime(&curtime)); printf("%s%ld\n",buffer,tv.tv_usec); return 0; } & # X2014; & # x2014; С помощью%ld форматирование микросекунд (а) не соответствует задаче вопроса форматирования миллисекунд и (б) не печатает микросекунды точно. когдаtv_usec держит 101 микросекунду, печатает.101 вместо.000101, & # X2014;printf("%s%.3ld\n", buffer, tv.tv_usec / 1000);
6

SYSTEMTIME структура даст вам миллисекунды. Затем вы должны использоватьФункции времени чтобы получить время. Как это:

#include <windows.h>

int main()
{
    SYSTEMTIME stime;
    //structure to store system time (in usual time format)
    FILETIME ltime;
    //structure to store local time (local time in 64 bits)
    FILETIME ftTimeStamp;
    char TimeStamp[256];//to store TimeStamp information
    GetSystemTimeAsFileTime(&ftTimeStamp); //Gets the current system time

    FileTimeToLocalFileTime (&ftTimeStamp,&ltime);//convert in local time and store in ltime
    FileTimeToSystemTime(&ltime,&stime);//convert in system time and store in stime

    sprintf(TimeStamp, "%d:%d:%d:%d, %d.%d.%d",stime.wHour,stime.wMinute,stime.wSecond, 
            stime.wMilliseconds, stime.wDay,stime.wMonth,stime.wYear);

    printf(TimeStamp);

    return 0;
} 
0

struct tvTime;

gettimeofday(&tvTime, NULL);

int iTotal_seconds = tvTime.tv_sec;
struct tm *ptm = localtime((const time_t *) & iTotal_seconds);

int iHour = ptm->tm_hour;;
int iMinute = ptm->tm_min;
int iSecond = ptm->tm_sec;
int iMilliSec = tvTime.tv_usec / 1000;
int iMicroSec = tvTime.tv_usec;
Этот код не компилируется. Вы могли бы иметь в видуstruct timeval tvTime; который тогда имеет шанс компиляции.
4

#include <iostream>
#include <iomanip>
#include <chrono>
#ifdef WIN32
#define localtime_r(_Time, _Tm) localtime_s(_Tm, _Time)
#endif

int main()
{
    tm localTime;
    std::chrono::system_clock::time_point t = std::chrono::system_clock::now();
    time_t now = std::chrono::system_clock::to_time_t(t);
    localtime_r(&now, &localTime);

    const std::chrono::duration<double> tse = t.time_since_epoch();
    std::chrono::seconds::rep milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(tse).count() % 1000;

    std::cout << (1900 + localTime.tm_year) << '-'
        << std::setfill('0') << std::setw(2) << (localTime.tm_mon + 1) << '-'
        << std::setfill('0') << std::setw(2) << localTime.tm_mday << ' '
        << std::setfill('0') << std::setw(2) << localTime.tm_hour << ':'
        << std::setfill('0') << std::setw(2) << localTime.tm_min << ':'
        << std::setfill('0') << std::setw(2) << localTime.tm_sec << '.'
        << std::setfill('0') << std::setw(3) << milliseconds
        << std::endl;
}
2

Похожие вопросы