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

Posted

技术标签:

【中文标题】如何像 Java 一样获取自 1970 年以来的当前时间戳(以毫秒为单位)【英文标题】:How to get current timestamp in milliseconds since 1970 just the way Java gets 【发布时间】:2013-11-02 12:32:05 【问题描述】:

在 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;

这看起来对吗?

【问题讨论】:

【参考方案1】:

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

#include <chrono>

// ...

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

【讨论】:

不错。在行尾添加 count() 以获取基本类型格式的毫秒数。 @lining:两个时期可能相同,但它们的值可能不同。 steady_clock 将始终向前发展,它是自其纪元以来时间的真实度量,而 system_clock 可能是自纪元以来的逻辑时间的表示。每闰秒,两者之间的距离可能会进一步扩大,具体取决于系统的实施。 据我所知,每个时钟的纪元都取决于实现。约定system_clock 与 UNIX 纪元相同,但规范只说它必须是系统范围的实时挂钟。 steady_clock没有要求与现实相匹配,只需要向前走。 @Jason 除了 gettimeofday 在 Windows 上不可用之外,chrono 库可以为您提供更高的分辨率(gtod 仅限于微秒),以类型安全的方式提供时间单位,因此编译器可以强制执行单位转换, 并与普通算术运算符一起使用(添加 timeval 结构很烦人)。 javascript 开发者看到这个都在嘲笑我 :(【参考方案2】:

使用&lt;sys/time.h&gt;

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

参考this。

【讨论】:

很好的解决方案,我也觉得应该是gettimeofday(&tp,NULL); 首先,这是C,不是C++。其次,gettimeofday有问题,例如见this。【参考方案3】:

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

获取当前系统时间:std::chrono::system_clock::now() 获取自纪元以来的时间:.time_since_epoch() 将底层单位转换为毫秒:duration_cast&lt;milliseconds&gt;(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;

【讨论】:

我建议使用unsigned long long 而不是uint64_t 为什么是unsigned long long 而不是uint64_t?我天生喜欢较短的类型来输入【参考方案4】:

这个答案与Oz.'s 非常相似,在 C++ 中使用&lt;chrono&gt;——我不是从 Oz 那里得到的。不过……

我在bottom of this page 找到了原始的sn-p,并稍微修改它成为一个完整的控制台应用程序。我喜欢用这个小东西。如果您编写了大量脚本并且需要在 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 你能告诉我你正在使用什么平台和 C++ 编译器吗?我一直用自动化工具使用这个东西,并且从未见过负输出 o.0 很高兴检查它。另外,这是直接复制,还是修改/集成的程序?只是想确保它仅源自此代码。 啊@kayleeFrye_onDeck 因为我使用的是intint nowms = std::chrono::duration_cast&lt;std::chrono::milliseconds&gt;(std::chrono::system_clock::now().time_since_epoch()).count();。我将其转换为int64_t 并且有效!非常感谢您要求提供更多信息以提供帮助! unsigned long long 更便携,__int64 仅在 MSVC 上可用。 标准 C++ 中没有 __int64 类型。可以改用std::int64_t【参考方案5】:

如果使用 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;

【讨论】:

【参考方案6】:

包含&lt;ctime&gt; 并使用time 函数。

【讨论】:

返回自纪元以来的秒数。不是毫秒。

以上是关于如何像 Java 一样获取自 1970 年以来的当前时间戳(以毫秒为单位)的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

Visual C++ 如何将日期时间转换为自 1970 年以来的秒数

获取自 Linux 上的 Epoch、Bash 以来的当前时间(以秒为单位)

将 Avro 中存储为整数(自 1970 年 1 月 1 日以来的天数)的“日期”转换为雪花“日期”类型

如何从 Java 8 中的 LocalDateTime 获取毫秒数

怎么在java里获取带有毫秒的时间