题目描述
在著名的unix系统中,使用了一种简洁高效的时间表示方法,即:
将1970年1月1日0点作为“unix纪元”的原点,从1970年1月1日开始经过的秒数存储为一个32位整数
请编写一个程序,帮助把一个unix时间辍,转换成形如"YYYY-mm-dd HH:ii:ss"的格式,其中的字母分别代表
YYYY 4 位数字完整表示的年份
mm 数字表示的月份,有前导零的 2 位数字
dd 月份中的第几天,有前导零的2位数字
HH 小时,24 小时格式,有前导零
ii 有前导零的分钟数
ss 秒数,有前导零
关于输入
输入数据有若干行,每行包含一个整数t,(0<=t<2^31)
关于输出
对每一行输入数据,输出一行,为形如“YYYY-mm-dd HH:ii:ss”格式的时间
例子输入
10 1234567890
例子输出
1970-01-01 00:00:10 2009-02-13 23:31:30
#include<iostream>
using namespace std;
int t;
void time(int x)//判断年月日
{
int year = 0,month=0;
int day = x;
int Month[13] = { -1,31,28,31,30,31,30,31,31,30,31,30,31 };
for (int i = 1970;; ++i) {//依次尝试能否过完这一年
bool flag = 1;
if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {
if (day >= 366) {
flag = 0;
++year;
day -= 366;
}
}
else {
if (day >= 365) {
flag = 0;
++year;
day -= 365;
}
}
if (flag)break;
}
int i = 1970 + year;
if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {
Month[2] = 29;
}
for (int i = 1;; ++i) {//依次尝试能否过完这月
if (day >= Month[i]) {
++month;
day -= Month[i];
}
else break;
}
printf("%d-%02d-%02d ", year+1970, month+1, day+1);//输出前导0!
}
int main()
{
while (cin >> t) {
int days, year, h, m, s;//求时分秒
days = t / 86400;
t %= 86400;
h = t / 3600;
t %= 3600;
m = t / 60;
s = t % 60;
time(days);
printf("%02d:%02d:%02d\n", h, m, s);
}
return 0;
}