Unix时间,或称POSIX时间是Unix或类Unix系统使用的时间表示方式:从协调世界时(UTC时间)1970年1月1日0时0分0秒起至现在的总秒数,不包括闰秒。UNIX时间戳的“0”按照ISO 8601规范为 :1970-01-01T00:00:00Z. 一个小时表示为UNIX时间戳格式为:3600秒;一天表示为UNIX时间戳为86400秒,闰秒不计算。在大多数的UNIX系统中UNIX时间戳存储为32位,这样会引发2038年问题或Y2038。
协调世界时2009年2月13日23时31分30秒(即北京时间2009年2月14日07时31分30秒)为Unix时间戳的“1234567890”。
以下时间以UTC时间为准,比如要转换的是北京时间,则先要减少8小时才是UTC时间,北京时间在东八区
转换代码如下: #摘自http://blog.chinaunix.net/u1/38994/showart_303272.html,稍做调整
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年的秒数
//---------------------------------------------------------------
//【 版 本 】v1.0
//【 函 数 名 称 】uint32 xDate2Seconds(_xtime *time)
//【 创建人及创建时间 】gliethttp 2006-06-08 10:19
//【 修改人及修改时间 】
//【 修 改 原 因 】
//【 功 能 描 述 】该函数计算从1970年1月1日0时0分0秒起到当前时间所经过的秒数
//---------------------------------------------------------------
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; //加上当前秒数
return seconds;
}
//---------------------------------------------------------------
//【 版 本 】v1.0
//【 函 数 名 称 】void xSeconds2Date(unsigned int seconds,_xtime *time)
//【 创建人及创建时间 】gliethttp 2006-06-08 10:20
//【 修改人及修改时间 】
//【 修 改 原 因 】
//【 功 能 描 述 】秒数转换为年、月、日、时、分、秒
//---------------------------------------------------------------
void xSeconds2Date(unsigned int 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 int leap_y_count;
time->second = seconds % 60;//获得秒
seconds /= 60;
time->minute = seconds % 60;//获得分
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; //获得日
}