UNIX Time 时间戳 与 北京时间 相互转换

typedef struct t_xtime {
  int year; int month;  int day;   
  int hour; int minute;  int second; 
} _xtime ;

#define xMINUTE   (60             ) //1分的秒数
#define xHOUR      (60*xMINUTE) //1小时的秒数
#define xDAY        (24*xHOUR   ) //1天的秒数
#define xYEAR       (365*xDAY   ) //1年的秒数

 

可以通过在线转换工具,对程序结果进行验证:http://tool.chinaz.com/Tools/unixtime.aspx

 

 

将localtime(UTC+8北京时间)转为UNIX TIME,以1970年1月1日为起点 

 

unsigned int  xDate2Seconds(_xtime *time)
{
  static unsigned int  month[12]={
    /*01月*/xDAY*(0),
    /*02月*/xDAY*(31),
    /*03月*/xDAY*(31+28),
    /*04月*/xDAY*(31+28+31),
    /*05月*/xDAY*(31+28+31+30),
    /*06月*/xDAY*(31+28+31+30+31),
    /*07月*/xDAY*(31+28+31+30+31+30),
    /*08月*/xDAY*(31+28+31+30+31+30+31),
    /*09月*/xDAY*(31+28+31+30+31+30+31+31),
    /*10月*/xDAY*(31+28+31+30+31+30+31+31+30),
    /*11月*/xDAY*(31+28+31+30+31+30+31+31+30+31),
    /*12月*/xDAY*(31+28+31+30+31+30+31+31+30+31+30)
  };
  unsigned int  seconds = 0;
  unsigned int  year = 0;
  year = time->year-1970;       //不考虑2100年千年虫问题
  seconds = xYEAR*year + xDAY*((year+1)/4);  //前几年过去的秒数
  seconds += month[time->month-1];      //加上今年本月过去的秒数
  if( (time->month > 2) && (((year+2)%4)==0) )//2008年为闰年
    seconds += xDAY;            //闰年加1天秒数
  seconds += xDAY*(time->day-1);         //加上本天过去的秒数
  seconds += xHOUR*time->hour;           //加上本小时过去的秒数
  seconds += xMINUTE*time->minute;       //加上本分钟过去的秒数
  seconds += time->second;               //加上当前秒数
 seconds -= 8 * xHOUR; return seconds; }

  

将UNIX时间转为UTC+8 即北京时间

//UNIX转为UTC 已进行时区转换 北京时间UTC+8
void xSeconds2Date(unsigned long seconds,_xtime *time )
{
	static unsigned int month[12]={
		/*01月*/31,  
		/*02月*/28,  
		/*03月*/31,  
		/*04月*/30,  
		/*05月*/31,  
		/*06月*/30,  
		/*07月*/31,  
		/*08月*/31,  
		/*09月*/30,  
		/*10月*/31,  
		/*11月*/30,  
		/*12月*/31  
	};
	unsigned int days;  
	unsigned short leap_y_count;  
	time->second      = seconds % 60;//获得秒  
	seconds          /= 60;  
	time->minute      =  seconds % 60;//获得分  
	seconds			 += 8 * 60 ;		//时区矫正 转为UTC+8 bylzs
	seconds          /= 60;  
	time->hour        = seconds % 24;//获得时  
	days              = seconds / 24;//获得总天数  
	leap_y_count = (days + 365) / 1461;//过去了多少个闰年(4年一闰)  
	if( ((days + 366) % 1461) == 0)  
	{//闰年的最后1天  
		time->year = 1970 + (days / 366);//获得年  
		time->month = 12;              //调整月  
		time->day = 31;  
		return;  
	}  
	days -= leap_y_count;  
	time->year = 1970 + (days / 365);     //获得年  
	days %= 365;                       //今年的第几天  
	days = 01 + days;                  //1日开始  
	if( (time->year % 4) == 0 )  
	{  
		if(days > 60)--days;            //闰年调整  
		else  
		{  
			if(days == 60)  
			{  
				time->month = 2;  
				time->day = 29;  
				return;  
			}  
		}  
	}  
	for(time->month = 0;month[time->month] < days;time->month++)  
	{  
		days -= month[time->month];  
	}  
	++time->month;               //调整月  
	time->day = days;           //获得日  
}

  

 

posted @ 2013-12-05 09:24  bigbigtree  阅读(10666)  评论(0编辑  收藏  举报