如何获取自1970年以来的当前时间戳(以毫秒为单位),就像Java一样


134

在Java中,System.currentTimeMillis()自历元时间起,我们可以使用来获取当前时间戳(以毫秒为单位)-

当前时间与UTC 1970年1月1日午夜之间的差(以毫秒为单位)。

在C ++中如何获得相同的东西?

目前,我正在使用它来获取当前时间戳-

struct timeval tp;
gettimeofday(&tp, NULL);
long int ms = tp.tv_sec * 1000 + tp.tv_usec / 1000; //get current timestamp in milliseconds

cout << ms << endl;

这看起来正确与否?

Answers:


239

如果您有权访问C ++ 11库,请签出该std::chrono库。您可以使用它来获取自Unix纪元以来的毫秒数,如下所示:

#include <chrono>

// ...

using namespace std::chrono;
milliseconds ms = duration_cast< milliseconds >(
    system_clock::now().time_since_epoch()
);

92
真好 在行末添加count()以获得基本类型格式的毫秒数。
P1r4nh4 2014年

1
@lining:两个时期可能相同,但它们的值可能不同。steady_clock会一直向前发展,这是对自其时代以来时间的真实度量,同时system_clock也可能代表自该时代以来的逻辑时间。对于每leap秒,取决于系统的实现,两者可能会进一步分开。
盎司

4
据我所知,每个时钟的纪元取决于实现。约定system_clock与UNIX时代相同,但规范仅说它必须是系统范围的实时壁钟。不需要steady_clock匹配现实,只要求它向前发展。
盎司

1
@Jason除了Windows上没有gettimeofday之外,chrono库还可以为您提供更高的分辨率(gtod限制为微秒),以类型安全的方式提供时间单位,以便编译器可以强制执行单位转换,并且可以与普通算术运算符一起使用(添加timeval结构很烦人)。
盎司

3
Javascript开发人员在嘲笑我看到以下内容:(
fantastory

42

<sys/time.h>

struct timeval tp;
gettimeofday(&tp, NULL);
long int ms = tp.tv_sec * 1000 + tp.tv_usec / 1000;

请参考这个


好的解决方案,我也应该是gettimeofday(&tp,NULL);
Adem 2014年

4
首先,这是C,而不是C ++。其次,与gettimeofday的问题,看到这个的例子。
rustyx '16

17

这个答案与Oz。的非常相似,使用<chrono> C ++的-因为我不是从奥兹抓住它。虽然...

我在本页底部找到了原始代码段,并将其稍作修改以使其成为一个完整的控制台应用程序。我喜欢用这个小东西。如果您执行大量脚本编写工作并且需要Windows中可靠的工具来获取实际毫秒数而又不求助于使用VB或一些较不现代,对读者更不友好的代码,那真是太棒了。

#include <chrono>
#include <iostream>

int main() {
    unsigned __int64 now = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
    std::cout << now << std::endl;
    return 0;
}

我得到一个负数,-560549313这是不对的,对吧?
Noitidart

1
@Noitidart您能告诉我您使用的平台和C ++编译器吗?我一直在使用自动化工具使用此工具,但从未见过负输出o.0,但乐于对其进行检查。另外,这是直接复制还是修改/集成的程序?只想确保它仅源于此代码。
kayleeFrye_onDeck

5
啊@kayleeFrye_onDeck它是因为我正在使用intint nowms = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();。我把它切换到int64_t它,并且有效!非常感谢您索取更多信息以帮助您!
Noitidart

unsigned long long具有更高的可移植性,并且__int64仅在MSVC上可用。
SS Anne

__int64在标准C ++中没有类型。一个可以std::int64_t代替使用。
jaskmar

13

如果使用gettimeofday,则必须强制转换为long long,否则会溢出,因此不是从纪元以来的实际毫秒数:long int msint = tp.tv_sec * 1000 + tp.tv_usec / 1000; 会给您一个类似于767990892的数字,该数字在时代;-)之后的8天左右。

int main(int argc, char* argv[])
{
    struct timeval tp;
    gettimeofday(&tp, NULL);
    long long mslong = (long long) tp.tv_sec * 1000L + tp.tv_usec / 1000; //get current timestamp in milliseconds
    std::cout << mslong << std::endl;
}

13

从C ++ 11开始,您可以使用std::chrono

  • 获取当前系统时间: std::chrono::system_clock::now()
  • 从时代开始就有时间: .time_since_epoch()
  • 将基础单位转换为毫秒: duration_cast<milliseconds>(d)
  • 转换std::chrono::milliseconds为整数(uint64_t以避免溢出)
#include <chrono>
#include <cstdint>
#include <iostream>

uint64_t timeSinceEpochMillisec() {
  using namespace std::chrono;
  return duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count();
}

int main() {
  std::cout << timeSinceEpochMillisec() << std::endl;
  return 0;
}

-25

包含<ctime>并使用该time功能。


30
返回从纪元开始的秒数。不是毫秒。
Progo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.