使用 gmtime() 获取人的生命的正确术语
Get proper term of person life using gmtime()
我正在尝试使用现在和出生日期之间的差异来计算人的确切年龄。我在几秒钟内得到差异,我认为这是正确的值。然后我想使用 gmtime()
将秒数转换为 struct tm
。但它在 70 上给了我一个比必须的大的 tm_year
,在比必须的大的 1 上给了我 tm_mday
。 tm_mday
似乎很清楚-它的范围是从1到31,我可以从中减去1,而tm_year
是从1900年开始的年份。好吧,为什么gmtime()
给我+70年?
#include <iostream>
#include <ctime>
using namespace std;
int main() {
int min,h,d,m,y;
struct tm bd = {0};
cout << "Enter birth date in the format: hh:min/dd.mm.yyyy"<<endl;
scanf("%d:%d/%d.%d.%d",&h,&min,&d,&m,&y);
bd.tm_year = y-1900;
bd.tm_mon = m-1;
bd.tm_mday = d;
bd.tm_hour = h;
bd.tm_min = min;
time_t now = time(NULL);
cout << "NOW: "<<now<<" BD: "<<mktime(&bd)<<endl;
time_t seconds = difftime(now,mktime(&bd));//(end,beginning)
cout <<"seconds elapsed: "<< seconds<<endl;
struct tm * age;
age = gmtime (&seconds);
cout << "year" << age->tm_year << endl;
cout << "mon" << age->tm_mon << endl;
cout << "mday" << age->tm_mday << endl;
cout << "hour" << age->tm_hour << endl;
cout << "min" << age->tm_min << endl;
cout << "sec" << age->tm_sec << endl;
}
输出:
Enter birth date in the format: hh:min/dd.mm.yyyy
13:28/04.03.2021
NOW: 1614853702 BD: 1614853680
seconds elapsed: 22
year 70
mon 0
mday 1
hour 0
min 0
sec 22
它正在将“unix 纪元时间”(自 1970 年以来的秒数)翻译成一个日期。
它没有将秒数转换为 days/months/years 的数量。基本上没有这种转换。 30 天可以少于或多于一个月。 365 天可以是一年,也可以比一年少 1 天。 24 乘以 60 乘以 60 秒可以小于闰秒发生的一天。
时间点之后的秒数是日期。但是秒并不能唯一地映射到 days/months/years.
的数量
找到两个时间点 - 日期 - 和 compare/subtract 个组成部分来做到这一点。
我正在尝试使用现在和出生日期之间的差异来计算人的确切年龄。我在几秒钟内得到差异,我认为这是正确的值。然后我想使用 gmtime()
将秒数转换为 struct tm
。但它在 70 上给了我一个比必须的大的 tm_year
,在比必须的大的 1 上给了我 tm_mday
。 tm_mday
似乎很清楚-它的范围是从1到31,我可以从中减去1,而tm_year
是从1900年开始的年份。好吧,为什么gmtime()
给我+70年?
#include <iostream>
#include <ctime>
using namespace std;
int main() {
int min,h,d,m,y;
struct tm bd = {0};
cout << "Enter birth date in the format: hh:min/dd.mm.yyyy"<<endl;
scanf("%d:%d/%d.%d.%d",&h,&min,&d,&m,&y);
bd.tm_year = y-1900;
bd.tm_mon = m-1;
bd.tm_mday = d;
bd.tm_hour = h;
bd.tm_min = min;
time_t now = time(NULL);
cout << "NOW: "<<now<<" BD: "<<mktime(&bd)<<endl;
time_t seconds = difftime(now,mktime(&bd));//(end,beginning)
cout <<"seconds elapsed: "<< seconds<<endl;
struct tm * age;
age = gmtime (&seconds);
cout << "year" << age->tm_year << endl;
cout << "mon" << age->tm_mon << endl;
cout << "mday" << age->tm_mday << endl;
cout << "hour" << age->tm_hour << endl;
cout << "min" << age->tm_min << endl;
cout << "sec" << age->tm_sec << endl;
}
输出:
Enter birth date in the format: hh:min/dd.mm.yyyy
13:28/04.03.2021
NOW: 1614853702 BD: 1614853680
seconds elapsed: 22
year 70
mon 0
mday 1
hour 0
min 0
sec 22
它正在将“unix 纪元时间”(自 1970 年以来的秒数)翻译成一个日期。
它没有将秒数转换为 days/months/years 的数量。基本上没有这种转换。 30 天可以少于或多于一个月。 365 天可以是一年,也可以比一年少 1 天。 24 乘以 60 乘以 60 秒可以小于闰秒发生的一天。
时间点之后的秒数是日期。但是秒并不能唯一地映射到 days/months/years.
的数量找到两个时间点 - 日期 - 和 compare/subtract 个组成部分来做到这一点。