Converting time_t to int

前端 未结 3 1794
没有蜡笔的小新
没有蜡笔的小新 2020-12-06 03:05

I want to convert a given time into epoch(time_t) and vice versa. can anyone tell what is the routine or algorithm for this?

Thanks

Update

相关标签:
3条回答
  • 2020-12-06 03:46

    You should cast it to a long int instead of int.

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

    An int might not be enough to hold the time, for example, on my platform, time_t is a typedef of __int64.

    0 讨论(0)
  • 2020-12-06 03:49

    Whatever you're doing with time_t, you'll probably be best off using the <chrono> library. Then you can convert to and from time_t, if necessary. Hopefully you can just do what you need in <chrono>

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

    Update:

    The C++ standard library doesn't yet have an API for dates as good as <chrono> is for time. You can use the Boost date library or you can fall back on the C date library:

    #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';
    }
    
    0 讨论(0)
  • 2020-12-06 03:49

    To convert a struct tm to a time_t, use mktime. To convert a time_t to a struct tm, use either gmtime or localtime.

    Sample:

    #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";
    }
    


    UPDATE 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);
    }
    
    0 讨论(0)
提交回复
热议问题