用C++获取Unix时间戳

2rs*_*2ts 55 c++ unix timestamp uint

如何uint在C++中获得unix时间戳?我用Google搜索了一下,似乎大多数方法都在寻找更复杂的方式来表示时间.我不能把它作为一个uint

Ton*_*roy 62

time()是最简单的功能 - 自大纪元以来的秒数.Linux手册页在这里.

上面链接的cppreference页面给出了这个例子:

#include <ctime>
#include <iostream>

int main()
{
    std::time_t result = std::time(nullptr);
    std::cout << std::asctime(std::localtime(&result))
              << result << " seconds since the Epoch\n";
}
Run Code Online (Sandbox Code Playgroud)

  • "Epoch"当然是Unix和Linux上的Unix eproch,但这并不普及. (3认同)
  • @socketpair:从 C++11 开始就支持该函数,但它最初与未指定的纪元相关(cppreference 只是说“时钟的纪元”)。从 C++20 开始,它被要求相对于 UNIX 纪元(0 UTC 1 Jan 1970)。cppreference 页面上没有讨论这种区别。 (3认同)
  • 请注意,“std::chrono::seconds”[定义为](https://en.cppreference.com/w/cpp/chrono/duration)“duration&lt;/*至少 35 位的有符号整数类型*/ &gt;`。因此,例如 32 位 int 可能还不够。 (2认同)

wil*_*ell 36

#include<iostream>
#include<ctime>

int main()
{
    std::time_t t = std::time(0);  // t is an integer type
    std::cout << t << " seconds since 01-Jan-1970\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 这假设`std::time()` 为您提供自 1970 年以来的秒数。在很多系统上都是如此(我相信 POSIX 和 Windows),但语言标准并不能保证这一点。 (3认同)

MSa*_*ers 15

最常见的建议是错误的,你不能只依靠time().这是用于相对时间:ISO C++没有指定1970-01-01T00:00Ztime_t(0)

更糟糕的是,你也不能轻易搞清楚.当然,你可以找到的日历日期time_t(0)gmtime,但你有什么打算做的,如果这是2000-01-01T00:00Z1970-01-01T00:00Z和之间有多少秒2000-01-01T00:00Z?由于闰秒,它肯定不是60的倍数.

  • 对于VS的UNIX时间; MSDN状态:time函数根据系统时钟返回自1970年1月1日午夜(00:00:00),协调世界时(UTC)以来经过的秒数.http://msdn.microsoft.com/en-us/library/1f4c8f33.aspx (5认同)
  • 要在非UNIX系统上获取**UNIX**时间戳,您必须知道本地时期与"1970-01-01T00:00Z"之间的差异(以秒为单位).没有办法可以做到这一点. (3认同)
  • @TonyD:IBM系统显然是个例外.因为他们在1-1-1970之前很好地从事计算机业务,所以并不令人惊讶. (2认同)

Tha*_*wen 8

由于这是 google 上的第一个结果,而且还没有 C++20 答案,这里是如何使用 std::chrono 来做到这一点:

#include <chrono>

//...

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

在 20 之前的 C++ 版本中,system_clock 的纪元是 Unix 纪元是事实上的约定,但它没有标准化。如果您使用的不是 C++20,请自担风险。

  • 该纪元将在 C++20 中得到正式认可:http://eel.is/c++draft/time.clock.system.overview (3认同)

ani*_*haw 5

#include <iostream>
#include <sys/time.h>

using namespace std;

int main ()
{
  unsigned long int sec= time(NULL);
  cout<<sec<<endl;
}
Run Code Online (Sandbox Code Playgroud)


小智 5

Windows 使用不同的纪元和时间单位:参见 Convert Windows Filetime to second in Unix/Linux

我不知道 std::time() 在 Windows 上返回的内容(迄今为止)(;-))


xin*_*ose 5

我创建了一个包含更多信息的全局定义:

#include <iostream>
#include <ctime>
#include <iomanip>

#define __FILENAME__ (__builtin_strrchr(__FILE__, '/') ? __builtin_strrchr(__FILE__, '/') + 1 : __FILE__)    // only show filename and not it's path (less clutter)
#define INFO std::cout << std::put_time(std::localtime(&time_now), "%y-%m-%d %OH:%OM:%OS") << " [INFO] " << __FILENAME__ << "(" << __FUNCTION__ << ":" << __LINE__ << ") >> "
#define ERROR std::cout << std::put_time(std::localtime(&time_now), "%y-%m-%d %OH:%OM:%OS") << " [ERROR] " << __FILENAME__ << "(" << __FUNCTION__ << ":" << __LINE__ << ") >> "

static std::time_t time_now = std::time(nullptr);
Run Code Online (Sandbox Code Playgroud)

像这样使用它:

INFO << "Hello world" << std::endl;
ERROR << "Goodbye world" << std::endl;
Run Code Online (Sandbox Code Playgroud)

示例输出:

16-06-23 21:33:19 [INFO] main.cpp(main:6) >> Hello world
16-06-23 21:33:19 [ERROR] main.cpp(main:7) >> Goodbye world
Run Code Online (Sandbox Code Playgroud)

将这些行放在您的头文件中。我发现这对于调试等非常有用。

  • @Troyseph 因为那时 `__FILE__``__FUNCTION__``__LINE__ ` 将无法按预期工作。这是一个宏。 (3认同)
  • 为了节省一些精力,您可以使用“%F %T”来替换“%y-%m-%d %OH:%OM:%OS”。 (2认同)