昨天看到一个求时间的帖子:
在C++中,已知从1900年1月1日到某天经过了7865284526秒,请帮我想一想怎样根据这个秒数把具体的日期时间求出(比如:2007年3月5日 10:20:32)
刚把它做出来,准备回复那个人的,结果没想到他结贴了。下面我把我的算法贴出来!
#include <iostream>
using namespace std;
int months = 0;
int leftdays = 0;
int a[] = {334,304,273,243,212,181,151,120,90,59,31,0};
__int64 seconds = 7865284526;
int daysToMonth(int sumDays)
{
bool flags = true;
int i = 0;
while (flags)
{
if (sumDays > a[i])
{
months = 12 - i;
leftdays = sumDays - a[i];
flags = false;
}
else
++i;
}
return months;
}
int main()
{
long second = 4*365*24*60*60 + 24*60*60;
int year = seconds/second;
int years = year*4;
int left = seconds%second;
int ssecond = 365*24*60*60;//每年的秒数
int lyear = left/ssecond;//剩余秒数对应的年数
int leftsec = left%ssecond;//换成年之后剩余的总秒数
int leftseconds = leftsec%60;//换算成分钟后剩余的秒数
int minutes = leftsec/60;//总分钟数
int leftminites = minutes%60;//剩余的分钟数
int hours = minutes/60;//总小时数
int lefthours = hours%24;//换成天剩余的小时数
int days = hours/24;//总天数
years += lyear;
int count = 0;//计算出将不是闰年的也当做闰年的年数
for (int x = 1900; x <= 1900+years; x++)
{
if((x%100 == 0)&&(x%400 != 0))
count++;
}
daysToMonth(days);
cout<<"所以,从1900年开始经过"<<seconds<<"秒后的时间为:"<<endl;
cout<<(years+1900)<<("年")<<months<<("月")<<leftdays<<("日")<<lefthours
<<("时")<<leftminites<<("分")<<leftseconds<<("秒")<<endl;
return 0;
}
本人的思路是这样的:先粗略的假设凡是能被4整除的年份就是闰年,则每4年中必有一年是闰年:if((years+1900)%4 == 0)是闰年的判断式。因此,我先求出4年的总时间second = 126230400(单位:秒),那么总时间(seconds/second)*4就是年数years,则剩下的即left = seconds%second中所包含年数最大为3,且其中一定不包含闰年,因为按照前面的第一条假设,1900年是"闰年".接下来的问题就是根据剩下的left秒求出有多少年(lyear)多少月多少日多少小时多少分多少秒。先求出年数lyear,得到真正的总年数years += lyear;再求出不构成分钟的剩下的秒数,再求出不构成小时的分钟数,再求出不构成一天的小时数,最后剩下天数,这里求出的天数也不是准确的,因为我的大假设是有点问题的,闰年的真正判别式为:
if(year%4==0 && year%100!=0 || year%400==0) 显然我的假设只可能让求出的天数变少,所以要把不是闰年当作闰年的年份求出来,每求出一年相应的天数就要加1。这样得出的天数days才是正确的。 由天数转化为月数我专门写了一个函数daysToMonth(int sumDays);
输出结果为:
所以,从1900年开始经过7865284526秒后的时间为:
2149年3月29日9时15分26秒