关于C++:将1970后的秒数转换为当前日期格式

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)


time()函数返回1970年1月1日以来的秒数。

把它转换成日期比你想象的要复杂得多:

  • 它从计算秒开始:取%60的数字,原则上应告诉当前分钟的秒数。这似乎很明显。但这并不准确:它没有考虑到1970年以来发生的25个跳跃秒。
  • 分钟,小时如果你考虑到这个第一次修正(并且最终考虑到夏令时,如果这个代码没有在冬天运行的话)
  • 您对月份日期的计算没有考虑到并非所有月份都有30天长的事实,也没有考虑闰年。
  • 基本上,月份和年份的计算会受到月份错误估计的影响。

帮自己一个忙,用标准函数(如gmtime()localtime()转换日期,并访问struct tm的字段。


将秒转换为天/小时/分钟很简单。将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;

等等。


将"从纪元开始的秒数"转换为日/月/年/等是一项极其艰巨的任务。

这就是图书馆为你提供服务的原因。有专门为此设计的gmtime_r()localtime()_r。不幸的是,这些功能不是标准的,唯一的标准功能是线程不安全的gmtime()localtime()