1. 系统时间函数
在编程时,时间函数不可避免的会被使用。linux系统下相关时间的数据结构有time_t,timeval,timespec,tm,clock_t; windows下time_t,tm,SYSTEMTIME,FILETIME,clock_t。其中clock_t、timeval、timespec用于表示时间跨度,time_t、tm、SYSTEMTIME,FILETIME用于表示绝对时间。不同的数据结构之间,多少也有些差异。
首先这些时间结构体的精度不同,Second(time_t/tm), microsecond(timeval/SYSTEMTIME), 100nanoSeconds(FILETIME),nanoSeconds(timespec)。还有一些结构和操作系统相关,如clock_t,windows下为1毫秒,POSIX 下为1微秒,对应clock_t,不同平台的差异,可以用宏CLOCKS_PER_SEC解决。
起始时间不同,time_t起始于1970年1月1日0时0分0秒,tm表示起始于1900年,SYSTEMTIME/FILETIME起始于1601年,clock起始于机器开机。
Windows下特有的时间转换函数包括:
GetLocalTime能够得到本地电脑设置时区的时间,得到的类型是SYSTEMTIME的类型。
- void GetSystemTime(LPSYSTEMTIME lpSystemTime); // GetSystemTime函数获得当前的UTC时间
- void GetLocalTime(LPSYSTEMTIME lpSystemTime); // GetLocalTime获得当前的本地时间
- BOOL SystemTimeToFileTime(const SYSTEMTIME* lpSystemTime,
- LPFILETIME lpFileTime);
- BOOL FileTimeToSystemTime(const FILETIME* lpFileTime,
- LPSYSTEMTIME lpSystemTime);
- BOOL LocalFileTimeToFileTime(const FILETIME* lpLocalFileTime,
- LPFILETIME lpFileTime);
- BOOL FileTimeToLocalFileTime(const FILETIME* lpFileTime,
- LPFILETIME lpLocalFileTime);
Windows下特有的获取时间精度的函数包括(精度微秒):
- BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
- BOOL QueryPerformanceCounter(LARGE_INTEGER *lpCount);
我们回想一下程序中的时间数据结构和函数的用法,可以发现主要是2个目的:
1. 获取绝对时间
2. 获取两个时间点的相对时间
Timestamp内部定义了一个Int64的变量_ts。存储了一个基于utc时间的64位int值,理论上可以提供微秒级的精度(实际精度依赖于操作系统)。由于Poco::Timestamp是基于UTC(世界标准时间或世界協調時間)的,所以它是独立于时区设置的。Poco::Timestamp实现了值语义,比较和简单的算术操作。
1. UTC (Coordinated Universal Time)是从1582年10月15日深夜开始计时的. Poco库中精度为100纳秒。
2. epoch time指是从1970年1月1日深夜开始计时的(指unix诞生元年)。Poco库中精度为1秒。