将 time_t 转换为 int

Posted

技术标签:

【中文标题】将 time_t 转换为 int【英文标题】:Converting time_t to int 【发布时间】:2012-03-18 01:04:35 【问题描述】:

我想将给定时间转换为 epoch(time_t),反之亦然。谁能告诉这个的例程或算法是什么?

谢谢

更新

 epoch_strt.tm_sec = 0;
 epoch_strt.tm_min = 0;
 epoch_strt.tm_hour = 0;
epoch_strt.tm_mday = 1;
epoch_strt.tm_mon = 1;
epoch_strt.tm_year = 70;
 epoch_strt.tm_isdst = -1;

double nsecs = difftime(curtime, basetime);//current time from system, I converrting it to struct tm

但由于某种原因,这总是返回 32399。

【问题讨论】:

“给定时间”的格式是什么? 是的,我们必须知道您要转换的格式。 请注意,epoch_strt.tm_mon = 1; 表示二月而不是一月。 【参考方案1】:

您应该将其转换为 long int 而不是 int

long int t = static_cast<long int> (time(NULL));

int 可能不足以保持时间,例如,在我的平台上,time_ttypedef__int64

【讨论】:

为什么不intmax_t?毫无价值:time_t 不保证是整数类型:它是算术类型,因此可能是浮点数。如果浮点数太大而无法容纳intmax_t,则未定义的行为。 POSIX 保证这不会发生,因为它说时间 t 返回自 EPOCH 以来的秒数,因此它不可能那么大,但 ANSI C 未指定它。 这是无效的语法。 static_cast 需要在源值周围加上括号。 请注意,在某些(许多)平台上,long intint 完全相同(例如,MSVC/Windows)。也许你在想long long int【参考方案2】:

无论您使用time_t 做什么,最好还是使用&lt;chrono&gt; 库。然后,如有必要,您可以与time_t 相互转换。希望您可以在&lt;chrono&gt;中做您需要的事情

#include <chrono>

int main() 
    auto a = std::chrono::system_clock::now()
    time_t b = std::chrono::system_clock::to_time_t(a);
    auto c = std::chrono::system_clock::from_time_t(b);

更新:

C++ 标准库还没有像&lt;chrono&gt; 一样好的日期API。您可以使用 Boost 日期库,也可以使用 C 日期库:

#include <ctime>
#include <chrono>
#include <iostream>

int main() 
    std::tm epoch_start = ;
    epoch_start.tm_sec = 0;
    epoch_start.tm_min = 0;
    epoch_start.tm_hour = 0;
    epoch_start.tm_mday = 1;
    epoch_start.tm_mon = 0;
    epoch_start.tm_year = 70;
    epoch_start.tm_wday = 4;
    epoch_start.tm_yday = 0;
    epoch_start.tm_isdst = -1;

    std::time_t base = std::mktime(&epoch_start);

    auto diff = std::chrono::system_clock::now() - std::chrono::system_clock::from_time_t(base);
    std::chrono::seconds s = std::chrono::duration_cast<std::chrono::seconds>(diff);

    std::cout << s.count() << '\n';

【讨论】:

年份应该是 b3 70 还是 1970? en.cppreference.com/w/cpp/chrono/c/tm tm_year 是自 1970 年以来的年份,因此要表示 1970,请将 tm_year 设置为 1970-1900 = 70 但我使用的是标准库。包括 而不是chrono。 @Yogi chrono 是标准库的一部分,但您的实现可能还没有它,因为它是去年才添加的。在 boost 中也有一个实现。如果您的标准库没有它并且您不能使用 boost,那么您可以使用 Rob 的解决方案和difftime【参考方案3】:

要将struct tm 转换为time_t,请使用mktime。要将time_t 转换为struct tm,请使用gmtimelocaltime

示例

#include <iostream>
#include <ctime>

int main () 
    std::time_t now = std::time(0);

    std::tm *now_tm = gmtime(&now);

    std::tm tomorrow_tm(*now_tm);

    tomorrow_tm.tm_mday += 1;
    tomorrow_tm.tm_hour = 0;
    tomorrow_tm.tm_min = 0;
    tomorrow_tm.tm_sec = 0;

    std::time_t tomorrow = std::mktime(&tomorrow_tm);

    double delta = std::difftime(tomorrow, now);

    std::cout << "Tomorrow is " << delta << " seconds from now.\n";


更新 2
#include <iostream>
#include <ctime>
#include <cassert>

// Display the difference between now and 1970-01-01 00:00:00
// On my computer, this printed the value 1330421747
int main () 

    std::tm epoch_strt;
    epoch_strt.tm_sec = 0;
    epoch_strt.tm_min = 0;
    epoch_strt.tm_hour = 0;
    epoch_strt.tm_mday = 1;
    epoch_strt.tm_mon = 0;
    epoch_strt.tm_year = 70;
    epoch_strt.tm_isdst = -1;

    std::time_t basetime = std::mktime(&epoch_strt);

    std::time_t curtime = std::time(0);

    long long nsecs = std::difftime(curtime, basetime);

    std::cout << "Seconds since epoch: " << nsecs << "\n";
    assert(nsecs > 42ll * 365 * 24 * 60 * 60);

【讨论】:

你能告诉我纪元日期,即 1970 年 1 月 1 日吗? 下载我上面的第二个示例程序,并将epoch_strt … = 0 行替换为您需要的内容。 我这样做了,但我不知道为什么它返回零。我在 nsec 中使用 long long,但是当我打印时没有出现

以上是关于将 time_t 转换为 int的主要内容,如果未能解决你的问题,请参考以下文章

如何将包含时间的字符串变量转换为 c++ 中的 time_t 类型?

将 long int 转换为 const time_t

无法将“const timeval”转换为“__time_t aka long int”

使用适当的 tm_mday 将两个 time_t 之间的差异转换为 tm

qt lineedith time_t 转换格式

从 time_t 和 tm 转换的错误值