获取带有C++的 Unix 时间戳
Get Unix timestamp with C++
如何在C++中获取uint
的 unix 时间戳?我用谷歌搜索了一下,似乎大多数方法都在寻找更复杂的方式来表示时间。我不能把它当作uint
吗?
C++20 引入了一个保证,即time_since_epoch
是相对于 UNIX 纪元的,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 时代。 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 Epochn";
}
#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-1970n";
return 0;
}
建议是错误的,你不能只依靠time()
。这用于相对计时:ISO C++ 没有指定1970-01-01T00:00Z
是time_t(0)
更糟糕的是,你也不能轻易弄清楚。当然,你可以用gmtime
找到time_t(0)
的日历日期,但如果这是2000-01-01T00:00Z
,你打算怎么做?1970-01-01T00:00Z
和 2000-01-01T00:00Z
之间有多少秒?由于闰秒,它当然不是 60 的倍数。
由于这是谷歌上的第一个结果,目前还没有 C++20 的答案,以下是使用 std::chrono 来做到这一点的方法:
#include <chrono>
//...
using namespace std::chrono;
int64_t timestamp = duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count();
在 20 之前的 C++ 版本中,system_clock 的时代是 Unix 时代是一个事实上的约定,但它不是标准化的。如果您不在 C++20 上,请使用风险自负。
#include <iostream>
#include <sys/time.h>
using namespace std;
int main ()
{
unsigned long int sec= time(NULL);
cout<<sec<<endl;
}
我创建了一个包含更多信息的全局定义:
#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
将这些行放在头文件中。 我发现这对于调试等非常有用。
Windows 使用不同的纪元和时间单位:请参阅在 Unix/Linux 中将 Windows 文件时间转换为秒
在Windows上返回的内容(到目前为止)对我来说是未知的(;-))
我有用,只需将纳秒转换为您喜欢的任何内容,然后将uint64_t转换为您喜欢的任何内容。
#include <chrono>
uint64_t unix_time()
{
return std::chrono::duration_cast<std::chrono::nanoseconds>
(
std::chrono::system_clock::now().time_since_epoch()
).count();
}
- C++:floor unix时间戳到UTC月份
- 将 unix 时间戳转换为人类可读的日期
- 将日期字符串转换为 unix 时间戳
- 如何将毫秒的日期时间字符串转换为 UNIX 时间戳
- 快速将带有时区的日期时间字符串转换为 UNIX 时间戳(C++)
- 如何将WSTRING中的Unix时间戳转换为char数组中格式的日期
- 使用 std::chrono 将 32 位 unix 时间戳转换为 std::string
- 如何在C++11中将Unix时间戳字符串转换为time_t
- 用C或C++将当前时间从windows转换为unix时间戳
- 使用 ctime 转换 UNIX 时间戳
- C++提升以 UTC 格式获取 unix 时间戳
- C++ Boost将UNIX时间戳转换为MySQL兼容的DATETIME字符串
- 从 UNIX 时间戳获取同月第一天的时间戳,而无需转换为本地时间
- 将 Unix 时间戳(以毫秒为单位)转换为正常日期
- boost::gregori::time到unix时间戳的时间为双
- 获取当前小时unix时间戳
- 如何在C++中生成unix时间戳
- 将字符串时间转换为UNIX时间戳
- 从 C/C++ 中的日期和时间转换为 UNIX 时间戳的正确方法是什么?
- 从GMT/UTC字符串到UNIX时间戳的Qt5(C++)转换