课后练习【循环之后 】
M: unix时间戳转换(循环,数组)
题目描述
时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。给定一个UNIX时间戳,请将其转换为日期所用格式。
输入
输出
最终转换的时间为北京时间。
输出时不必考虑对数字格式化,如2018/01/01,只需输出2018/1/1
样例输入
1514736000
样例输出
2018/1/1 0:0:0
提示
对闰年的情况需要额外考虑,输入的时间戳确保在int范围之内
注意
自带8小时,这样子如果不管他,计算完了直接加上8求余会出现老是少一天的情况,所以应该一开始就加上这8小时。
AC代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,a,b,c,d,h,m,i;
int fr[12]={31,28,30,31,30,31,30,31,30,31,30,31};
int r[12]={31,29,30,31,30,31,30,31,30,31,30,31};
cin>>n;
n=n+8*3600;
a=n/126230400;
n=n%126230400;
if(n<31536000)
b=0;
else if(n>=31536000&&n<31536000*2)
{
b=1;
n=n-31536000*2;
}
else if(n>=31536000*2&&n<31536000*2+31622400)
{
b=2;
n=n-31536000*2;
}
else
{
b=3;
n=n-31536000*2-31622400;
}
if(b!=2)
{
d =n/86400+1;
n=n%86400;
h=n/3600;
n=n%3600;
m=n/60;
n=n%60;
c=1;
for(i=0;i<12;i++)
{
if(d>fr[i])
{
c++;
d=d-fr[i];
}
else
break;
}
}
else if(b==2)
{
d =n/86400+1;
n=n%86400;
h=n/3600;
n=n%3600;
m=n/60;
n=n%60;
c=1;
for(i=0;i<12;i++)
{
if(d>r[i])
{
c++;
d=d-r[i];
}
else
break;
}
}
cout<<1970+a*4+b<<"/"<<c<<"/"<<d<<" "<<h<<":"<<m<<":"<<n;
}