如何uint
在C ++中获得Unix时间戳?我已经用Google搜索了一下,似乎大多数方法都在寻找更复杂的方法来表示时间。我不能只是把它当作uint
?
Answers:
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 Epoch\n";
}
最常见的建议是错误的,您不能仅仅依靠time()
。这是用于相对时间:ISO C ++没有指定1970-01-01T00:00Z
是time_t(0)
更糟糕的是,您也无法轻易地弄清楚。当然,您可以找到time_t(0)
带有的日历日期gmtime
,但是如果那样的话您将怎么办2000-01-01T00:00Z
?1970-01-01T00:00Z
与之间有多少秒2000-01-01T00:00Z
?由于leap秒,它肯定不是60的倍数。
gmtime()
稍后调用以获取该时间戳编码的任何内容的可读表示,无论time()
参考日期或间隔计算的适用性如何,问题中要求的功能均不满足?
1970-01-01T00:00Z
。只是没有方法可以做到这一点。
由于这是google上的第一个结果,并且尚无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;
}
time()
返回类型为的结果,time_t
原则上可以是有符号,无符号甚至是浮点数。为什么将结果存储在中long int
?为什么要使用<sys/time.h>
而不是标准<time.h>
?
Windows使用不同的纪元和时间单位:请参阅 在Unix / Linux中将Windows Filetime转换为秒
我还不知道Windows上的std :: time()返回什么(;-))
我创建了具有更多信息的全局定义:
#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
将这些行放在头文件中。我发现这对于调试等非常有用。
#define
没有功能?功能将更加灵活,可重载,使用起来更明显……
__FILE__``__FUNCTION__``__LINE__
将无法正常工作。这是一个宏。