C/C++ time处理及其相互转换

C 的时间

time_point

时间单位默认是秒,绝对时间获取的时间点都是相对新纪元。相关概念:

新纪元:1970年1月1日00:00:00 UTC(GMT)

#include <time.h>

typedef long time_t //时间点,秒单位

time_t time(time_t *t) //返回自从新纪元以来流逝的秒数,将当前时间点写入到t


/***************************/
// 少用
#include <sys/time.h>

struct timeval {
    time_t        tv_sec;   // 秒
    susenconds_t  tv_usec;  // 微秒
}

int gettimeofday(struct timeval *tv,
                 struct timezone *tz);


/***************************/
// 常用
#include <time.h>

struct timespec {
    time_t    tv_sec;   // 秒
    long      tv_nsec;  // 纳秒
}

int clock_gettime(clockid_t clock_id,
                  struct timespec *ts);


/***************************/
// 时间差
double difftime(time_t time1, time_t time0);

tm 是人们容易理解的时间格式

#include <time.h>

struct tm {
    int tm_sec;
    int tm_min;
    int tm_hour;
    int tm_mday;  /*该月的日期,0~31*/
    int tm_mon;   /*0~11*/
    int tm_year;  /*从1900年以来的年数*/
    int tm_wday;  /*从周日以来的天数 0~6*/
    int tm_yday;  /*从1月1日以来的日期数 0~356*/
    int tm_isdst;
#ifdef _BSD_SOURCE
    long tm_gmtoff;
    const char *tm_zone;
#endif /* _BSD_SOURCE */
};

时间字符串表达:

char * asctime(const struct tm *tm); // tm -> str

char * ctime(const time_t *timep);   // time_t -> str 

struct tm * localtime(const time_t *timep); // time_t -> tm

time_t mktime(struct tm *tm);               // tm -> time_t

C++

std::chrono是一个Time library,同时c库的<time.h>在c++里表示为<ctime>。c++版本封装了不同单位的时间功能,忽略了获取的时间是秒、还是微秒抑或是纳秒的概念

分为三个模块

Durations

默认是秒:

typedef std::chrono::duration<int> seconds_type;
typedef std::chrono::duration<int, std::milli> milliseconds_type;
typedef std::chrono::duration<int, std::ratio<60*60>> hours_type;

std::chrono::seconds
std::chrono::milliseconds


std::chrono::hours = typedef duration<int, ratio<3600, 1>> hours;
std::chrono::minutes = typedef duration<int, ratio<60, 1>> minutes;
std::chrono::seconds = typedef duration<int, ratio<1, 1>> seconds;
std::chrono::milliseconds = typedef duration<int, ratio<1, 1000>> milliseconds;
std::chrono::microseconds = typedef duration<int, ratio<1, 1000000>> microseconds;
std::chrono::nanoseconds = typedef duration<int, ratio<1, 1000000000>> nanoseconds;

不同单位的转换  std::chrono::duration_cast,例子

std::chrono::seconds s = std::chrono::duration_cast<std::chrono::seconds> (std::chrono::milliseconds ms);

将当前milliseconds转成seconds

c的time_t 为long 型,可以直接输出,而durations需要使用count()方法输出

 

Time points

std::chrono::system::clock::time_point today = std::chrono::system_clock::now();

time_t tt;

tt = system_clock::to_time_t ( today );
std::cout << "today is: " << ctime(&tt);

获取now()的epoch时间,epoch即从1970年1月1日00:00:00以来的格林尼治时间,需要注意这里的时区问题

std::chrono::system_clock::now().time_since_epoch()

Clocks

std::chrono::system_clock相当于C的CLOCK_REALTIME

std::chrono::steady_clock相当于C的CLOCK_MONOTONIC

std::chrono::high_resolution_clock 高精度版本,但是It may be a synonym for system_clock or steady_clock.[cplusplus.com]

三个static member functions

std::chrono::system_clock::now()  // get current time

C++时间与C时间的转换

time_t std::chrono::system_clock::to_time_t(const time_point& tp);

time_point std::chrono::system_clock::from_time_t(time_t t)

UTC和CST的影响

time_since_epoch这个时间是获取从1970.1.1以来UTC的duration。 就是说如果该机子使用的是UTC时间,那么time_since_epoch就是UTC的duration,但是如果该机子使用了CST时间,那么time_since_epoch.count()的具体过程:先将CST推算出UTC时间,即CST - 8个时区,之后得到就是现在的UTC时间和1970.1.1的UTC时间的duration。为了避免同时区造成的影响,使用做差时间。本机用时间函数将1970.1.1转成time_point,再用get_now()与之做差得到duration,去掉了时区的影响。如果本机直接使用UTC时间,time_since_epoch也是UTC,两者单位都是UTC,自然没有影响

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章