课后练习【循环之后 】 M: unix时间戳转换(循环,数组)

课后练习【循环之后 】

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;
}

你可能感兴趣的:(课后练习【循环之后 】 M: unix时间戳转换(循环,数组))