• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
#include<stdio.h>
#include<string.h>

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<(4*365+1);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人参与评论

请发表评论

全部评论

专题导读
上一篇:
总结:CLR Via C#(第15章):委托发布时间:2022-07-14
下一篇:
C++中接口与实现分离的技术发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap