如何像 Java 那样获得自1970年以来以毫秒为单位的当前时间戳

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

当前时间和 世界协调时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;

这看起来对不对?

422589 次浏览

使用 <sys/time.h>

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

请参阅 这个

如果您可以访问 C + + 11库,请查看 std::chrono库。你可以用它来得到 Unix 时代以来的毫秒数,如下所示:

#include <chrono>


// ...


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

如果使用 gettimeofday,则必须强制转换为 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;
}

这个答案非常类似于 奥兹的,在 C + + 中使用 <chrono>——尽管我没有从 Oz 中获取..。

我在 本页的底部上获取了原始代码片段,并稍微修改了一下,使其成为一个完整的控制台应用程序。我喜欢用这个小东西。如果您需要编写大量脚本,并且在 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;
}

由于 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;
}