#include "stdafx.h"
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
time_t now = time(NULL);
int sec = now % 60;
int min = ((now - sec) / 60) % 60;
int hour = ((((now - sec) / 60) - min) / 60) % 24;
int day = ((((((now - sec) / 60) - min) / 60) - hour) / 24) % 30;
int month = ((((((((now - sec) / 60) - min) / 60) - hour) / 24) - day) / 30) % 12;
int year = ((((((((((now - sec) / 60) - min) / 60) - hour) / 24) - day) / 30) - month) / 12) + 1970;
cout << hour << ":" << min << ":"<< ":" << day << ":" << month << ":" << year<<endl;
}
我无法理解为什么月份输出10而不是3 ???
(我知道有c_time函数,但我正在学习并制作自己的函数)
答案 0 :(得分:1)
time()
函数返回自1970年1月1日以来的秒数。
将此转换为日期比您想象的要复杂得多:
%60
原则上应该告诉当前分钟的秒数。这似乎很明显。但这并不准确:它没有考虑自1970年以来发生的25 leap seconds。帮自己一个忙,并使用gmtime()
或localtime()
等标准函数转换日期并访问struct tm
答案 1 :(得分:0)
自从纪元以来转换“秒”是一项非常艰巨的任务。到日/月/年/等。
这就是图书馆让你了解的原因。有gmtime_r()
和localtime()_r
专门为此而设计。遗憾的是,这些函数不是标准函数,唯一标准函数是线程不安全gmtime()
和localtime()
。
答案 2 :(得分:0)
将秒转换为天/小时/分钟是微不足道的。将1970年以来的天数转换为当前日期不是。如果可以,你应该使用库函数,或者你可以使用为Julian day提供的公式,只要注意朱利安日的1/1/1970不是0。
PS减法提醒完全没必要:
int min = ((now - sec) / 60) % 60;
应该是:
int min = now / 60 % 60;
甚至更好:
int sec = now % 60;
now /= 60;
int min = now % 60;
now /= 60;
等等。