【C++·C11】C++ 时间与时间戳

我们在实际开发过程中,经常需要用到时间戳与时间以及它们之间的转换,这里简单总结一下C++中的时间与时间戳的相关内容

时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总毫秒数。

通俗的讲, 时间戳是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。 它的提出主要是为用户提供一份电子证据, 以证明用户的某些数据的产生时间。 在实际应用上, 它可以使用在包括电子商务、 金融活动的各个方面, 尤其可以用来支撑公开密钥基础设施的 “不可否认” 服务。

实际程序设计中用到关于时间相关的变量类型结构,主要有

  • time_t
  • struct tm
  • struct timeval

1.time_t简介

time_t,是一个长整形, 这种类型就是用来存储从1970年到现在经过了多少秒,代码如下

#include 
//#include  这是c++中引入c语言标准库头文件写法
time_t t = time(NULL);

ps:time()函数也可以指定参数,参数类型是time_t * ,如果带有参数,函数调用时会同时给time_t参数赋值,其实也没啥意义,实际使用一般用代码示例中的写法

2.timeval简介

timeval是一种更精确的结构,里面有两个成员,分别时秒与微秒

struct timeval
{
    long tv_sec; /*秒*/
    long tv_usec; /*微秒*/
};

可使用函数gettimeofday来获取

//返回当前距离1970年的秒数和微秒数,tz是时区一般不用
int gettimeofday(struct timeval * tv,strcut timezone *tz);

3.tm简介

这个没啥说的,看结构题注释就行

struct tm
{
    int tm_sec;  /*秒,正常范围0-59, 但允许至61*/
    int tm_min;  /*分钟,0-59*/
    int tm_hour; /*小时, 0-23*/
    int tm_mday; /*日,即一个月中的第几天,1-31*/
    int tm_mon;  /*月, 从一月算起,0-11*/  1+p->tm_mon;
    int tm_year;  /*年, 从1900至今已经多少年*/  1900+ p->tm_year;
    int tm_wday; /*星期,一周中的第几天, 从星期日算起,0-6*/
    int tm_yday; /*从今年1月1日到目前的天数,范围0-365*/
    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; 
}

你可能感兴趣的:(Windows编程,c++,开发语言)