程序随笔——timestamp(时间戳)

来源:互联网 发布:淘宝p图教程 编辑:程序博客网 时间:2024/06/06 22:43

在实际编程中,经常需要用到时间戳。因此,对Linux上的一些时间API进行封装,实现了个CTimestamp类,该类的内部用一个int64_t类型来存储时间,时间精度为微秒。类重载了比较,提供了转换为字符串的方法。

1. Timestamp.h

#ifndef __TIMESTAMP_H__#define __TIMESTAMP_H__#include <stdint.h>#include <string>#include <boost/operators.hpp>class CTimestamp:public boost::less_than_comparable<CTimestamp>, public boost::equality_comparable<CTimestamp>{public:CTimestamp();explicit CTimestamp(int64_t microSeconds);~CTimestamp();bool empty();void swap(CTimestamp ×tamp);int64_t getMicroSeconds() const;std::string toFormattedString(bool bLocal = true)const;static CTimestamp now();private:static const int64_t s_MicroSecondsPerSecond = 1000 * 1000;int64_t m_microSeconds;};//less_than_comparableinline bool operator<(const CTimestamp &lTimestamp, const CTimestamp &rTimestamp){returnlTimestamp.getMicroSeconds() < rTimestamp.getMicroSeconds();}//equality_comparableinline bool operator==(const CTimestamp &lTimestamp, const CTimestamp &rTimestamp){return lTimestamp.getMicroSeconds() == rTimestamp.getMicroSeconds();}#endif//#ifndef __TIMESTAMP_H__
2. Timestamp.cpp

#include <sys/time.h>#include <time.h>#include <algorithm>#include "Timestamp.h"CTimestamp::CTimestamp():m_microSeconds(0){}CTimestamp::CTimestamp(int64_t microSeconds):m_microSeconds(microSeconds){}CTimestamp::~CTimestamp(){}bool CTimestamp::empty(){return m_microSeconds == static_cast<int64_t>(0);}void CTimestamp::swap(CTimestamp ×tamp){std::swap(m_microSeconds, timestamp.m_microSeconds);}int64_t CTimestamp::getMicroSeconds() const{return m_microSeconds;}std::string CTimestamp::toFormattedString(bool bLocal) const{char arrBuffer[64] = {0};//gmtime()能够把日历时间转换为一个对应于UTC的分解时间,gmtime_r()是它的可重入版//原型:struct tm *gmtime_r(const time_t *timep, struct tm *result);//localtime()需要考虑时区和夏令时设置,localtime_r()是它的可重入版本//原型:struct tm *localtime_r(const time_t *timep, struct tm *result);struct tm tm_time;time_t second_time = static_cast<time_t>(m_microSeconds / CTimestamp::s_MicroSecondsPerSecond);if (bLocal)localtime_r(&second_time, &tm_time);elsegmtime_r(&second_time, &tm_time);int iMicroSeconds = static_cast<int>(m_microSeconds % CTimestamp::s_MicroSecondsPerSecond);snprintf(arrBuffer, sizeof(arrBuffer), "%04d-%02d-%02d %02d:%02d:%02d-%06d",tm_time.tm_year + 1900, tm_time.tm_mon + 1, tm_time.tm_mday,tm_time.tm_hour, tm_time.tm_min, tm_time.tm_sec, iMicroSeconds);return arrBuffer;}CTimestamp CTimestamp::now(){struct timeval tvValue;gettimeofday(&tvValue, NULL);int64_t microSeconds = static_cast<int64_t>(tvValue.tv_sec * CTimestamp::s_MicroSecondsPerSecond + tvValue.tv_usec);return CTimestamp(microSeconds);}
3. main.cpp
#include <iostream>#include "Timestamp.h"using namespace std;int main(void){CTimestamp oldTimestamp = CTimestamp::now();sleep(5);CTimestamp newTimestamp = CTimestamp::now();cout << "oldTimestamp : " << oldTimestamp.toFormattedString() << endl;cout << "newTimestamp : " << newTimestamp.toFormattedString() << endl;if (newTimestamp > oldTimestamp){cout << "newTimestamp > oldTimestamp" << endl;}else{cout << "newTimestamp <= oldTimestamp" << endl;}return 0;}
输出如下:

oldTimestamp : 2017-07-12 22:12:35-880046newTimestamp : 2017-07-12 22:12:40-881864newTimestamp > oldTimestamp




原创粉丝点击