convert seconds elapsed since 1970 to current date format
本问题已经有最佳答案,请猛点这里访问。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #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; } |
I can't understand why month output 10 instead of 3 ???
(I know there is c_time function but i am learning and making my own one)
把它转换成日期比你想象的要复杂得多:
- 它从计算秒开始:取
%60 的数字,原则上应告诉当前分钟的秒数。这似乎很明显。但这并不准确:它没有考虑到1970年以来发生的25个跳跃秒。 - 分钟,小时如果你考虑到这个第一次修正(并且最终考虑到夏令时,如果这个代码没有在冬天运行的话)
- 您对月份日期的计算没有考虑到并非所有月份都有30天长的事实,也没有考虑闰年。
- 基本上,月份和年份的计算会受到月份错误估计的影响。
帮自己一个忙,用标准函数(如
将秒转换为天/小时/分钟很简单。将1970年以来的天数转换为当前日期不是。如果可以的话,您应该使用库函数,或者可以使用为儒略日提供的公式,只需注意1/1/1970对于儒略日不是0。
PS减法提示完全不必要:
1 | int min = ((now - sec) / 60) % 60; |
应该是:
1 | int min = now / 60 % 60; |
甚至更好:
1 2 3 4 | int sec = now % 60; now /= 60; int min = now % 60; now /= 60; |
等等。
将"从纪元开始的秒数"转换为日/月/年/等是一项极其艰巨的任务。
这就是图书馆为你提供服务的原因。有专门为此设计的