1.簡介
時間戳簡單來說就是時間替換成的秒數(shù)塞茅。
2.應用
2.1 時間轉(zhuǎn)換為時間戳
給出代碼即可,不做過多介紹季率。
.h文件內(nèi)容:
#ifndef _mktime_h_
#define _mktime_h_
struct tm {
int tm_sec; /* seconds */
int tm_min; /* minutes */
int tm_hour; /* hours */
int tm_mday; /* day of the month */
int tm_mon; /* month */
int tm_year; /* year */
int tm_wday; /* day of the week */
int tm_yday; /* day in the year */
int tm_isdst; /* daylight saving time */
};
#endif
.c文件內(nèi)容:
#include "mktime.h"
#define MINUTE 60
#define HOUR (60*MINUTE)
#define DAY (24*HOUR)
#define YEAR (365*DAY)
/* interestingly, we assume leap-years */
static int month[12] = { //--每月初所經(jīng)過的秒數(shù)
0,
DAY*(31),
DAY*(31+29),
DAY*(31+29+31),
DAY*(31+29+31+30),
DAY*(31+29+31+30+31),
DAY*(31+29+31+30+31+30),
DAY*(31+29+31+30+31+30+31),
DAY*(31+29+31+30+31+30+31+31),
DAY*(31+29+31+30+31+30+31+31+30),
DAY*(31+29+31+30+31+30+31+31+30+31),
DAY*(31+29+31+30+31+30+31+31+30+31+30)
};
long kernel_mktime(struct tm * tm)
{
long res;
int year;
year = tm->tm_year - 70; //--年數(shù)
/* magic offsets (y+1) needed to get leapyears right.*/
res = YEAR*year + DAY*((year+1)/4); //--年數(shù)+閏年數(shù)
res += month[tm->tm_mon]; //--月
/* and (y+2) here. If it wasn't a leap-year, we have to adjust */
if (tm->tm_mon>1 && ((year+2)%4)) //--若(y+2)不是閏年野瘦,則減一天
res -= DAY;
res += DAY*(tm->tm_mday-1); //--當月已經(jīng)過的天數(shù)
res += HOUR*tm->tm_hour; //--當天已經(jīng)過的小時數(shù)
res += MINUTE*tm->tm_min; //--此時已經(jīng)過的分鐘
res += tm->tm_sec; //--此分已經(jīng)過的秒
return res;
}
注意時間戳不是按照當?shù)氐臅r間來算的,而是有一個基準:格林威治時間飒泻,它屬于UTC 0 (GMT)鞭光,而我們是屬于東八區(qū),所以一般根據(jù)我們的時間算出來的時間戳需要減去8個小時的偏差才是真正的格林威治時間轉(zhuǎn)換過來的時間戳泞遗。
因此惰许,如果是數(shù)據(jù)上傳到云平臺,只需要上傳unix時間戳即可史辙,后面的時區(qū)只需要云平臺去關注就好汹买。
3.多說一句
如果用的是keil,工具本身是包含mktime()
的聊倔。