1.简介
时间戳简单来说就是时间替换成的秒数。
2.应用
2.1 时间转换为时间戳
给出代码即可,不做过多介绍。
.h文件内容:
#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文件内容:
#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] = { //--每月初所经过的秒数
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; //--年数
/* magic offsets (y+1) needed to get leapyears right.*/
res = YEAR*year + DAY*((year+1)/4); //--年数+闰年数
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); //--当月已经过的天数
res += HOUR*tm->tm_hour; //--当天已经过的小时数
res += MINUTE*tm->tm_min; //--此时已经过的分钟
res += tm->tm_sec; //--此分已经过的秒
return res;
}
注意时间戳不是按照当地的时间来算的,而是有一个基准:格林威治时间,它属于UTC 0 (GMT),而我们是属于东八区,所以一般根据我们的时间算出来的时间戳需要减去8个小时的偏差才是真正的格林威治时间转换过来的时间戳。
因此,如果是数据上传到云平台,只需要上传unix时间戳即可,后面的时区只需要云平台去关注就好。
3.多说一句
如果用的是keil,工具本身是包含mktime()
的。
网友评论