是否存在将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;
答案 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时间戳。希望能有所帮助:)