如何以1970年以来的Java方式获取当前时间戳(以毫秒为单位)

AKI*_*WEB 113 c++ timestamp

在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;
Run Code Online (Sandbox Code Playgroud)

看起来对不对?

Oz.*_*Oz. 207

如果您可以访问C++ 11库,请查看std::chrono库.您可以使用它来获取自Unix Epoch以来的毫秒数:

#include <chrono>

// ...

using namespace std::chrono;
milliseconds ms = duration_cast< milliseconds >(
    system_clock::now().time_since_epoch()
);
Run Code Online (Sandbox Code Playgroud)

  • 尼斯.在行的末尾添加count()以获得基本类型格式的毫秒数. (70认同)
  • 据我所知,每个时钟的时期都取决于实现.惯例是`system_clock`与UNIX纪元相同,但规范只说它必须是系统范围的实时挂钟.没有要求`steady_clock`匹配现实,只是它只向前推进. (4认同)
  • JavaScript开发人员嘲笑我看到了这个:( (3认同)

Try*_*ing 38

使用 <sys/time.h>

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

参考这个.

  • 首先,这是C,而不是C++.其次,gettimeofday存在问题,例如参见[this](https://blog.habets.se/2010/09/gettimeofday-should-never-be-used-to-measure-time). (4认同)

Ale*_*ato 25

从 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么使用“unsigned long long”而不是“uint64_t”?我天生偏爱较短的类型 (4认同)

kay*_*eck 13

这个答案是非常相似奥兹的.使用<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;
}
Run Code Online (Sandbox Code Playgroud)

  • 啊@kayleeFrye_onDeck它因为我使用`int`!`int nowms = std :: chrono :: duration_cast <std :: chrono :: milliseconds>(std :: chrono :: system_clock :: now().time_since_epoch()).count();`.我把它转换成`int64_t`并且它有效!非常感谢您寻求更多信息帮助! (5认同)
  • `unsigned long long` 更可移植,而 `__int64` 仅在 MSVC 上可用。 (2认同)
  • 标准 C++ 中没有“__int64”类型。可以使用 `std::int64_t` 来代替。 (2认同)

rli*_*rli 12

如果使用gettimeofday你必须转换为long long,否则你将获得溢出,因此不是自epoch以来的实际毫秒数: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;
}
Run Code Online (Sandbox Code Playgroud)