【问题标题】:How to get UTC seconds since epoch till midnight如何从纪元到午夜获得 UTC 秒数
【发布时间】:2015-11-13 10:46:11
【问题描述】:

我必须实例化一个使用nanoseconds since 'epoch' in UTC time 构造的自定义库类的对象:

class utc_time
{
public:
utc_time(TYPE nanoseconds_since_epoch):
_nanoseconds_since_epoch(nanoseconds_since_epoch){}

private:
TYPE _nanoseconds_since_epoch;
};

我的输入是nanoseconds since 'midnight' in UTC time。自然,我需要获取epoch 直到最后一个midnight 纳秒(以UTC 为单位),以将其添加到我的输入中并将其提供给我的类构造函数。 我知道我们有 gtime 可能会有所帮助,但我不知道如何提取所需的信息。

感谢你的提示

【问题讨论】:

  • 请不要标记垃圾邮件这是一个 C++ 问题而不是 C 问题,我已经删除了不正确的标记。

标签: c++


【解决方案1】:

在 C++11 及更高版本中,<chrono> 可以很容易地做到这一点:

#include <chrono>
#include <iostream>

int
main()
{
    using namespace std::chrono;
    using namespace std;
    using days = duration<int, ratio<86400>>;
    nanoseconds last_midnight =
        time_point_cast<days>(system_clock::now()).time_since_epoch();
    cout << last_midnight.count() << '\n';
}

【讨论】:

  • 问题是关于UTC日期时间。我认为您没有考虑在计算自纪元以来的时间之前将当前时间转换为 UTC 时间。
  • @Bit_Pulse:我认为这段代码从上一个 UTC 午夜开始计算 Unix 时间 (en.wikipedia.org/wiki/Unix_time) 中的纳秒数。我刚刚运行它,它输出1490313600000000000,它正好是17249 * 86400 * 10^9,今天是自1970-01-01 以来的第17249 天。如果在接受的答案中更正了 type-o,则当前返回 1490331600,这是我的答案,但以秒而不是纳秒为单位。
  • 您需要考虑从哪个时区开始测试您的代码以及在什么时间。如果 UTC 日期比您当前日期晚一天,那么只有您会看到此问题,否则,您将始终获得相同的时差,因为它一直到午夜。 system_clock::now() 返回 system_clock 帧中的当前时间点,而不是 UTC 时间。我希望你能理解这个问题。
  • @Bit_Pulse:我明白。我已经编写了目前可用的最好的 C++ 时区处理库:howardhinnant.github.io/date/tz.html OP 将输入和输出精确地锁定到 UTC。不涉及除 UTC 以外的时区。此外,我的回答以实物为准:从不考虑UTC以外的任何时区或时间标准。如果您想了解我将如何处理“本地午夜后的秒数”或“其他时区午夜后的秒数”,我很乐意向您展示如何处理基于 &lt;chrono&gt; 的干净代码。请在上面发布一个问题。
【解决方案2】:

实际上,自纪元以来的纳秒 = 自午夜以来的纳秒 + 1e9 * 上一个午夜的日历时间。你缺乏后者的价值。您可以使用::gmtime()::mktime() 的组合来构建它。

#include <ctime>

std::time_t last_midnight()
{
    // compute "now"
    std::tm& tm = *::gmtime(NULL);
    // move it to "last midnight"
    tm.tm_hour = 0;
    tm.tm_min  = 0;
    tm.tm_sec  = 0;
    // get time_t back
    return ::mktime(&tm);
}

您可能会对使用::gmtime_r()(重入版)而不是::gmtime() 感兴趣。

【讨论】:

    猜你喜欢
    • 2012-10-03
    • 2010-11-07
    • 1970-01-01
    • 2012-08-12
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    相关资源
    最近更新 更多