Как получить время в миллисекундах в C ++ - PullRequest
7 голосов
/ 14 мая 2010

В Java вы можете сделать это:

long now = (new Date()).getTime();

Как мне сделать то же самое, но в C ++?

Ответы [ 7 ]

12 голосов
/ 14 мая 2010

Потому что C ++ 0x потрясающий

namespace sc = std::chrono;

auto time = sc::system_clock::now(); // get the current time

auto since_epoch = time.time_since_epoch(); // get the duration since epoch

// I don't know what system_clock returns
// I think it's uint64_t nanoseconds since epoch
// Either way this duration_cast will do the right thing
auto millis = sc::duration_cast<sc::milliseconds>(since_epoch);

long now = millis.count(); // just like java (new Date()).getTime();

Это работает с gcc 4.4+. Скомпилируйте это с --std=c++0x. Я еще не знаю, реализует ли VS2010 std::chrono.

9 голосов
/ 14 мая 2010

В стандарте C ++ такого метода нет (в стандарте C ++ есть только вторая точность, а не миллисекунда). Вы можете сделать это непереносимым способом, но так как вы не указали, я предполагаю, что вы хотите портативное решение. Лучшая ставка, я бы сказал, это функция повышения microsec_clock :: local_time () .

5 голосов
/ 14 мая 2010

Мне нравится иметь функцию с именем time_ms, определенную так:

// Used to measure intervals and absolute times
typedef int64_t msec_t;

// Get current time in milliseconds from the Epoch (Unix)
// or the time the system started (Windows).
msec_t time_ms(void);

Реализация ниже должна работать как в Windows, так и в Unix-подобных системах.

#if defined(__WIN32__)

#include <windows.h>

msec_t time_ms(void)
{
    return timeGetTime();
}

#else

#include <sys/time.h>

msec_t time_ms(void)
{
    struct timeval tv;
    gettimeofday(&tv, NULL);
    return (msec_t)tv.tv_sec * 1000 + tv.tv_usec / 1000;
}

#endif

Обратите внимание, что время, возвращаемое ветвью Windows, составляет миллисекунды с момента запуска системы, а время, возвращаемое ветвью Unix, составляет миллисекунды с 1970 года. Таким образом, если вы используете этот код, полагайтесь только на разницу между временами, а не на абсолютную само время.

3 голосов
/ 06 мая 2012

Вы можете попробовать этот код (получить из исходного кода шахматного движка StockFish (GPL)):

#include <iostream>
#include <stdio>

#if !defined(_WIN32) && !defined(_WIN64) // Linux - Unix
    #  include <sys/time.h>
    typedef timeval sys_time_t;
    inline void system_time(sys_time_t* t) {
        gettimeofday(t, NULL);
    }
    inline long long time_to_msec(const sys_time_t& t) {
        return t.tv_sec * 1000LL + t.tv_usec / 1000;
    }
    #else // Windows and MinGW
    #  include <sys/timeb.h>
    typedef _timeb sys_time_t;
    inline void system_time(sys_time_t* t) { _ftime(t); }
    inline long long time_to_msec(const sys_time_t& t) {
        return t.time * 1000LL + t.millitm;
    }
#endif


int main() {
    sys_time_t t;
    system_time(&t);
    long long currentTimeMs = time_to_msec(t);
    std::cout << "currentTimeMs:" << currentTimeMs << std::endl;
    getchar();  // wait for keyboard input
}
3 голосов
/ 14 мая 2010

Стандартный C ++ не имеет функции времени с точностью до секунды.

Тем не менее, почти каждая операционная система делает. Поэтому вы должны написать код, который зависит от ОС.

Win32:
GetSystemTime()
GetSystemTimeAsFileTime()

Unix / POSIX:
gettimeofday()
clock_gettime()

0 голосов
/ 22 января 2019

Java:

package com.company;

public class Main {

    public static void main(String[] args) {
        System.out.println(System.currentTimeMillis());

    }
}

c++:

#include <iostream>
#include <windows.h>

__int64 currentTimeMillis() {
    FILETIME f;
    ::GetSystemTimeAsFileTime(&f);
    __int64 nano = (__int64(f.dwHighDateTime) << 32LL) + __int64(f.dwLowDateTime);
    return (nano - 116444736000000000LL) / 10000;
}

int main() {

    printf("%lli\n ", currentTimeMillis());

    return 0;
}
0 голосов
/ 14 мая 2010

В Boost есть полезная библиотека для этого:

http://www.boost.org/doc/libs/1_43_0/doc/html/date_time.html

ptime microsec_clock :: local_time () или ptime second_clock :: local_time ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...