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; //获得日 }