将自1970年以来经过的秒数转换为当前日期格式

时间:2016-03-02 22:14:03

标签: c++ time

#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函数,但我正在学习并制作自己的函数)

3 个答案:

答案 0 :(得分:1)

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

将此转换为日期比您想象的要复杂得多:

  • 首先计算秒数:取数字%60原则上应该告诉当前分钟的秒数。这似乎很明显。但这并不准确:它没有考虑自1970年以来发生的25 leap seconds
  • 分钟,如果考虑到第一次校正(并最终考虑夏令时,如果此代码不在冬季运行),小时就可以了。
  • 您对该月日期的计算没有考虑到并非所有月份都是30天的事实,并且它没有考虑到闰年。
  • 基本上,月份和年份的计算会受到错误估计月份的影响。

帮自己一个忙,并使用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;

等等。