用C++获取Unix时间戳

atmip9wb  于 2023-04-01  发布在  Unix
关注(0)|答案(7)|浏览(232)

如何在C++中获得uint unix时间戳?我在谷歌上搜索了一下,似乎大多数方法都在寻找更复杂的方式来表示时间。我不能直接获得uint吗?

e5njpo68

e5njpo681#

C++20引入了time_since_epoch相对于UNIX epoch的保证,cppreference.com给出了一个例子,我已经提取了相关代码,并将单位改为秒而不是小时:

#include <iostream>
#include <chrono>
 
int main()
{
    const auto p1 = std::chrono::system_clock::now();
 
    std::cout << "seconds since epoch: "
              << std::chrono::duration_cast<std::chrono::seconds>(
                   p1.time_since_epoch()).count() << '\n';
}

使用C++17或更早版本时,time()是最简单的函数--自Epoch以来的秒,对于Linux和UNIX来说,至少是UNIX epoch。
上面链接的cppreference页面给出了这个example

#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";
}
gcuhipw9

gcuhipw92#

#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;
}
s5a0g9ez

s5a0g9ez3#

最常见的建议是错误的,你不能只依赖time()。它用于相对计时:ISO C++没有指定1970-01-01T00:00Ztime_t(0)
更糟糕的是,你也不容易找到它。当然,你可以用gmtime找到time_t(0)的日历日期,但是如果那是2000-01-01T00:00Z,你该怎么办?1970-01-01T00:00Z2000-01-01T00:00Z之间有多少秒?由于闰秒,它肯定不是60的倍数。

bz4sfanl

bz4sfanl4#

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

#include <chrono>

//...

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

在C20之前的版本中,system_clock的epoch是Unix epoch是一个事实上的约定,但它不是标准化的。如果你不是在C20上,请自担风险。

ovfsdjhp

ovfsdjhp5#

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

using namespace std;

int main ()
{
  unsigned long int sec= time(NULL);
  cout<<sec<<endl;
}
ktecyv1j

ktecyv1j6#

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

#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);

像这样使用它:

INFO << "Hello world" << std::endl;
ERROR << "Goodbye world" << std::endl;

样本输出:

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

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

6vl6ewon

6vl6ewon7#

Windows使用不同的纪元和时间单位:参见Convert Windows Filetime to second in Unix/Linux
在Windows上,std::time()返回的是什么(到目前为止)我还不知道(;- ))

相关问题