对于我使用的Windows,是否有跨平台解决方案可以获取自纪元以来的秒数
long long NativesGetTimeInSeconds()
{
return time (NULL);
}
但是如何进入 Linux 呢?
std::time(0)
(不要忘记#include <ctime>
)。然而,标准中并未指定 std::time
是否实际返回自纪元以来的时间(C11,由 C++ 标准引用):
7.27.2.4
函数time
剧情简介
#include <time.h> time_t time(time_t *timer);
描述
时间功能确定当前日历时间。 值的编码未指定。[强调我的]
time_since_epoch
。然而,在 C++20 之前,std::chrono::system_clock
的纪元未指定,因此在以前的标准中可能是不可移植的。
不过,在 Linux 上,即使在 C++11、C++14 和 C++17 中,
std::chrono::system_clock
通常也会使用 Unix 时间,因此您可以使用以下代码:
#include <chrono>
// make the decltype slightly easier to the eye
using seconds_t = std::chrono::seconds;
// return the same type as seconds.count() below does.
// note: C++14 makes this a lot easier.
decltype(seconds_t().count()) get_seconds_since_epoch()
{
// get the current time
const auto now = std::chrono::system_clock::now();
// transform the time into a duration since the epoch
const auto epoch = now.time_since_epoch();
// cast the duration into seconds
const auto seconds = std::chrono::duration_cast<std::chrono::seconds>(epoch);
// return the number of seconds
return seconds.count();
}
在C.
time(NULL);
在 C++ 中。
std::time(0);
时间的返回值是:time_t而不是long long
简单、便携且正确的方法
#include <ctime>
long CurrentTimeInSeconds()
{
return (long)std::time(0); //Returns UTC in Seconds
}
用于获取时间的原生 Linux 函数是
gettimeofday()
[还有其他一些风格],但是它可以让你获得以秒和纳秒为单位的时间,这超出了你的需要,所以我建议你继续使用 time()
。 [当然, time()
是通过在某处调用 gettimeofday()
来实现的 - 但我没有看到使用两段不同的代码来做完全相同的事情的好处 - 如果你想要这样,你会在 Windows 上使用 GetSystemTime()
或类似的东西 [不确定这个名称是否正确,自从我在 Windows 上编程已经有一段时间了]
#include <chrono>
#include <iostream>
#include <iomanip>
template <typename Duration, typename Clock>
Duration get_duration_since_epoch()
{
const auto tp = std::chrono::time_point_cast<Duration>(Clock::now());
return tp.time_since_epoch();
}
int main()
{
using float_sec_t = std::chrono::duration<double, std::chrono::seconds::period>;
// integer seconds
std::cout << get_duration_since_epoch<std::chrono::seconds, std::chrono::system_clock>() << std::endl;
// double seconds
std::cout << std::setprecision(15) << get_duration_since_epoch<float_sec_t , std::chrono::system_clock>() << std::endl;
}