C語言實現將時間戳轉換為年月日時分秒和將年月日時分秒轉換為時間戳


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

 

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM