Преобразование time_t в int - PullRequest
       13

Преобразование time_t в int

4 голосов
/ 28 февраля 2012

Я хочу преобразовать данное время в эпоху (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 по некоторым причинам.

Ответы [ 3 ]

10 голосов
/ 28 февраля 2012

Вы должны привести его к long int вместо int.

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

int может быть недостаточно для удержания времени, например, на моей платформе time_t - это typedef из __int64.

1 голос
/ 28 февраля 2012

Что бы вы ни делали с time_t, вам, вероятно, лучше всего использовать библиотеку <chrono>. Затем вы можете конвертировать в и из time_t, если это необходимо. Надеюсь, вы можете просто сделать то, что вам нужно в <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);
}

Обновление:

Стандартная библиотека C ++ пока не имеет API для дат, а <chrono> - для времени. Вы можете использовать библиотеку дат 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';
}
0 голосов
/ 28 февраля 2012

Чтобы преобразовать struct tm в time_t, используйте mktime.Чтобы преобразовать time_t в struct tm, используйте gmtime или localtime.

Образец :

#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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...