将Unix时间戳转换为人类可读的日期

时间:2018-08-23 20:34:52

标签: c++ time

是否存在将unix时间戳转换为人类可读日期的现代方法? 由于我想规避2038年的问题,因此我想使用int64s。 我的目标是转换e。 G。 1205812558至

年= 2008,月= 3,天= 18, 小时= 17,分钟= 18,秒= 36

我现在所拥有的一切

auto year = totalSeconds / secondsPerYear + 1970;
// month and day missing
auto hours = totalSeconds / 3600 % 24;
auto minutes = totalSeconds / 60 % 60;
auto seconds = totalSeconds % 60; 

4 个答案:

答案 0 :(得分:1)

Howard Hinnant的date library使事情变得很简单:

#include "date.h"

int main()
{
    using namespace date;
    time_t time = 32879409516;
    auto sysTime = std::chrono::system_clock::from_time_t(time);
    auto date = year_month_day(floor<days>(sysTime));
    std::cout << date << "\n";
}

答案 1 :(得分:1)

在C ++ 20中(根据目前的C ++ 20规范草案),您将可以说:

#include <chrono>
#include <iostream>

int
main()
{
    using namespace std;
    using namespace std::chrono;
    cout << sys_seconds{1205812558s} << '\n';
    cout << sys_seconds{32879409516s} << '\n';
}

它将输出:

2008-03-18 03:55:58
3011-11-28 17:18:36

这些是UTC的日期时间。

您现在可以使用Howard Hinnant's date library通过添加以下内容来试用此扩展的<chrono>功能:

#include "date/date.h"

    using namespace date;

以上程序。您可以experiment online with this program here

这种现代功能确实存在局限性,但它们的使用寿命大约为+/- 32K(远远超出了当前民用日历的精度范围)。

为完全透明,确实存在仅使用C ++ 98/11/14/17进行此操作的方法,但是它们比这更复杂,并且会遇到多线程错误。这是由于使用了过时的C API,该API是在多线程和C ++等即将出现时以及year 2001 was only associated with science fiction(例如gmtime)时设计的。

答案 2 :(得分:0)

一个很好的简单解决方案,但可以做一些小的改动:

uint32_t days = (uint32_t)floor(subt / 86400);
uint32_t hours = (uint32_t)floor(((subt - days * 86400) / 3600) % 24);
uint32_t minutes = (uint32_t)floor((((subt - days * 86400) - hours * 3600) / 60) % 60);
uint32_t seconds = (uint32_t)floor(((((subt - days * 86400) - hours * 3600) - minutes * 60)) % 60);
printf("Time remaining: %u Days, %u Hours, %u Minutes, %u Seconds\n", days, hours, minutes, seconds);

答案 3 :(得分:-1)

不需要外部库。我使用:

uint32_t days =     (uint32_t)floor(subt / 86400);
uint32_t hours =    (uint32_t)floor( ( (subt - days) / 3600) % 24 );
uint32_t minutes =  (uint32_t)floor( ( ( ( subt - days) - hours) / 60) % 60 );
uint32_t seconds =  (uint32_t)floor( ( ( ( ( subt - days ) - hours ) - minutes ) ) % 60 );
printf("Time remaining: %u Days, %u Hours, %u Minutes, %u Seconds\n", days, hours, minutes, seconds);

subt是Unix时间戳。希望能有所帮助:)