0、读取系统毫秒级时间
long getCurrentTime()
{
struct timeval tv;
gettimeofday(&tv,NULL);
return tv.tv_sec * 1000 + tv.tv_usec / 1000;
}
1、时间戳(秒级)
在Linux系统中,时间戳是一个绝对值,表示距离时间(1970-1-1, 00:00:00)的秒数。在C\C++ 语言中,用数据类型time_t 表示时间戳,time_t 本质上是一个long int。获取当前时间的时间戳代码如下所示:
#include
#include
int main(int argc, const char * argv[])
{
time_t now;
time(&now);
printf("now:%ld",now);
}
上面程序打印出的数据为“now:1470918308” ;1470918308表示当前时间距离格林威治时间的秒数;在shell终端下命令 "date -d @1470918308 " 打印出这个时间戳的日期格式为Thu Aug 11 20:22:47 CST 2016。
2、如何将时间戳转换成特定的时间格式
经常碰到的一个问题是将一个时间戳显示成指定的显示格式,比如讲上面的时间显示为2016-8-11。C/C++ 语言中,和时间操作相关的关键数据结构是struc tm,其定义如下:
struct tm {
int tm_sec; /* seconds 0-59*/
int tm_min; /* minutes 0-59*/
int tm_hour; /* hours 0-23*/
int tm_mday; /* day of the month 1-31*/
int tm_mon; /* month 0-11*/
int tm_year; /* year *距离1990的年数/
int tm_wday; /* day of the week 0-6*/
int tm_yday; /* day in the year 0-365*/
int tm_isdst; /* daylight saving time */
};
在将时间戳表示成指定格式前,我们需要将时间戳转换成tm数据结构。C/C++提供了俩个函数struct tm *gmtime(const time_t *timep) 和struct tm *localtime(const time_t *timep); 其中gtime转换后的tm是基于时区0的,而localtime转换后的是基于当地时区【中国为时区8】;因为同一时间戳在不同地区的表示时间是不一样的【因为时区不一样】。我们便可利用经过localtime转换后的tm展示当前时间了,tim_mo+1、tm_year+1990后才是我们想要看到的时间。我们也可以利用接口 size_t strftime(char *s, size_t max, const char *format,const struct tm *tm) 来定制我们的时间格式。
#include<stdio.h>
#include<time.h>
int main(int argc, const char * argv[])
{
time_t t;
time(&t);
struct tm *tmp_time = localtime(&t);
char s[100];
strftime(s, sizeof(s), "%04Y%02m%02d %H:%M:%S", tmp_time);
printf("%d: %s\n", (int)t, s);
return 0;
}
上面程序输出的数据为:1470919776: 20160811 20:49:36。因此利用strftime我们可以随意定制化显示时间。
3、如何将时间格式转换时间戳
有时候我们并不是想得到当前时间戳(time(&t)),而是希望将特定时间格式转换成时间戳,比如计算2016/8/13的时间戳是多少。C/C++提供char *strptime(const char *s, const char *format, struct tm *tm);将时间格式字符串S按指定格式foramt解析成tm; 再用time_t mktime(struct tm *tm)函数将tm生成时间戳。例如程序打印2016/08/13的时间戳。
#include
#include
int main(int argc, const char * argv[])
{
struct tm* tmp_time = (struct tm*)malloc(sizeof(struct tm));
strptime("2016/08/13/06/12","%Y/%m/%d/%H/%M",tmp_time); //按当地时区将2016/08/13/06/12解析成tmp_time
time_t t = mktime(tmp_time);//按当地时区解析tmp_time
printf("%ld\n",t);
free(tmp_time);
}