utc时间转换为时分秒_C语言实现将时间戳转换为年月日时分秒和将年月日时分秒转换为时间戳...

#include

#include

typedef unsigned int time_t;

struct tm {

int tm_sec; /* 秒 – 取值区间为[0,59] */

int tm_min; /* 分 - 取值区间为[0,59] */

int tm_hour; /* 时 - 取值区间为[0,23] */

int tm_mday; /* 一个月中的日期 - 取值区间为[1,31] */

int tm_mon; /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */

int tm_year; /* 年份,其值等于实际年份减去1900 */

};

const char Days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

void localtime(time_t time,struct tm *t)

{

unsigned int Pass4year;

int hours_per_year;

if(time < 0)

{

time = 0;

}

//取秒时间

t->tm_sec=(int)(time % 60);

time /= 60;

//取分钟时间

t->tm_min=(int)(time % 60);

time /= 60;

//取过去多少个四年,每四年有 1461*24 小时

Pass4year=((unsigned int)time / (1461L * 24L));

//计算年份

t->tm_year=(Pass4year << 2) + 1970;

//四年中剩下的小时数

time %= 1461L * 24L;

//校正闰年影响的年份,计算一年中剩下的小时数

for (;;)

{

//一年的小时数

hours_per_year = 365 * 24;

//判断闰年

if ((t->tm_year & 3) == 0)

{

//是闰年,一年则多24小时,即一天

hours_per_year += 24;

}

if (time < hours_per_year)

{

break;

}

t->tm_year++;

time -= hours_per_year;

}

//小时数

t->tm_hour=(int)(time % 24);

//一年中剩下的天数

time /= 24;

//假定为闰年

time++;

//校正闰年的误差,计算月份,日期

if((t->tm_year & 3) == 0)

{

if (time > 60)

{

time--;

}

else

{

if (time == 60)

{

t->tm_mon = 1;

t->tm_mday = 29;

return ;

}

}

}

//计算月日

for (t->tm_mon = 0; Days[t->tm_mon] < time;t->tm_mon++)

{

time -= Days[t->tm_mon];

}

t->tm_mday = (int)(time);

return;

}

static time_t mon_yday[2][12] =

{

{0,31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334},

{0,31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335},

};

int isleap(int year)

{

return (year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0);

}

time_t mktime(struct tm dt)

{

time_t result;

int i =0;

// 以平年时间计算的秒数

result = (dt.tm_year - 1970) * 365 * 24 * 3600 +

(mon_yday[isleap(dt.tm_year)][dt.tm_mon-1] + dt.tm_mday - 1) * 24 * 3600 +

dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;

// 加上闰年的秒数

for(i=1970; i < dt.tm_year; i++)

{

if(isleap(i))

{

result += 24 * 3600;

}

}

return(result);

}

void main()

{

time_t time = 0;

time_t time2 = 0;

long i = 0;

struct tm t;

//2018-01-01 01:01:01

time = 1514768461;

// 验证一个周期4年 一天打印一次

for(i=0;i

{

localtime(time,&t);

printf("A time:%d\r\n",time);

printf("A %04d-%02d-%02d %02d:%02d:%02d\r\n",t.tm_year,t.tm_mon+1,t.tm_mday,t.tm_hour,t.tm_min,t.tm_sec);

t.tm_mon+=1;//转换时月份需要加1,因为月份是从0开始的

time2 = mktime(t);//将localtime得到年月日时分秒再次转换成时间戳,验证算法是否正确

printf("B time:%d\r\n",time2);

memset((void*)&t,0x00,sizeof(t));

localtime(time2,&t);

printf("B %04d-%02d-%02d %02d:%02d:%02d\r\n",t.tm_year,t.tm_mon+1,t.tm_mday,t.tm_hour,t.tm_min,t.tm_sec);

memset((void*)&t,0x00,sizeof(t));

time += 24*3600;

}

return;

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值