我们在实际开发过程中,经常需要用到时间戳与时间以及它们之间的转换,这里简单总结一下C++中的时间与时间戳的相关内容
时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总毫秒数。
通俗的讲, 时间戳是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。 它的提出主要是为用户提供一份电子证据, 以证明用户的某些数据的产生时间。 在实际应用上, 它可以使用在包括电子商务、 金融活动的各个方面, 尤其可以用来支撑公开密钥基础设施的 “不可否认” 服务。
我们再计算机中使用的UTC时间都是从1970年01月01日00时00分00秒开始计算的,实际程序设计中用到关于时间相关的变量类型结构,主要有
- time_t
- struct time
- struct timeval
在C++中我们使用time_t(它是一个长整形) 这种类型就是用来存储从1970年到现在经过了多少秒,代码如下
#include//#include 这是c++中引入c语言标准库头文件写法 time_t t = time(NULL);
time()函数也可以指定参数,参数类型是time_t * ,如果带有参数,函数调用时会同事给time_t参数赋值
如果想要更精确可以使用
struct timeval
{
long tv_sec;
long tv_usec;
};
timeval这个结构,可使用函数gettimeofday来获取
//返回当前距离1970年的秒数和微秒数,tz是时区一般不用 int gettimeofday(struct timeval * tv,strcut timezone *tz);
还有一个结构是tm,定义如下
struct tm
{
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon; 1+p->tm_mon;
int tm_year; 1900+ p->tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
};
上面我们简单了解了这三个结构的主要类型,接下来 我们来看一下我们的时间函数
//将time_t转换为没有进过时区转换的UTC时间 //也就是返回的是标准的UCT时间的tm结构 struct tm* gmtime(const time_t *timep); //如果使用gmtime获取tm ,并用stftime显示时间的话, 需要在time_t + 28800,因为格林威治跟北京时间相差8个小时
//将time_t 转换成经过时区转换的本地时间 stuct tm* localtime(const time_t *timep);
//将tm结构中的信息转换为真实世界时间,以字符串显示 //格式:星期 月 日 时 分 秒 年 char *asctime(const struct tm* timeptr); //这是宽字节版 wchar_t * _wasctime(const struct tm * timeprt);
//通过time_t获取本地真实时间 char *ctime(const time_t *timer); //宽字节版 wchar_t * _wctime(const time_t * timer);
MSDN ctime相关资料
ctime也就相当于我们调用了localtime 然后有调用了asctime
其他函数
//将tm时间转换成time_t时间戳 time_t mktime(struct tm * time);
//返回time1和 time2相差秒数 double difftime(time_t time2,time_t time1);
//将tm的值格式化输出 size_t strftime( char *strDest, size_t maxsize, const char *format, const struct tm *timeptr ); //宽字节版 size_t wcsftime( wchar_t *strDest, size_t maxsize, const wchar_t *format, const struct tm *timeptr );
MSDN stftime相关资料
示例代码
#include#include #include #include int main() { time_t t; time(&t); time_t ta = t; struct tm * timeinfo = gmtime(&t); char szUCT[MAX_PATH] = { 0 }; strftime(szUCT, MAX_PATH, "当前格林威治时间: %Y-%m-%d %H-%M-%S", timeinfo); struct tm * timelocalinfo = localtime(&ta); char szTime[MAX_PATH] = { 0 }; strftime(szTime, MAX_PATH, "当前本地时间:%Y-%m-%d %H-%M-%S", timelocalinfo); std::cout << szUCT << std::endl; std::cout << szTime << std::endl; }



