在 Linux 中获取自纪元以来的秒数

问题描述 投票:0回答:5

对于我使用的Windows,是否有跨平台解决方案可以获取自纪元以来的秒数

long long NativesGetTimeInSeconds()
{
    return time (NULL);
}

但是如何进入 Linux 呢?

c++ linux windows time
5个回答
29
投票

您已经在使用它:

std::time(0)
(不要忘记
#include <ctime>
)。然而,标准中并未指定
std::time
是否实际返回自纪元以来的时间(C11,由 C++ 标准引用):

7.27.2.4
time
函数

剧情简介

#include <time.h>
time_t time(time_t *timer);

描述

时间功能确定当前日历时间。 值的编码未指定。[强调我的]

对于 C++、C++11 及更高版本提供

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();
}

17
投票

在C.

time(NULL);

在 C++ 中。

std::time(0);

时间的返回值是:time_t而不是long long


3
投票

简单、便携且正确的方法

#include <ctime>

long CurrentTimeInSeconds()
{
     return (long)std::time(0); //Returns UTC in Seconds
}

2
投票

用于获取时间的原生 Linux 函数是

gettimeofday()
[还有其他一些风格],但是它可以让你获得以秒和纳秒为单位的时间,这超出了你的需要,所以我建议你继续使用
time() 
。 [当然,
time()
是通过在某处调用
gettimeofday()
来实现的 - 但我没有看到使用两段不同的代码来做完全相同的事情的好处 - 如果你想要这样,你会在 Windows 上使用
GetSystemTime()
或类似的东西 [不确定这个名称是否正确,自从我在 Windows 上编程已经有一段时间了]


0
投票
#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;
}

https://wandbox.org/permlink/HULwKXGyc5m0pIVQ

© www.soinside.com 2019 - 2024. All rights reserved.