1 时间概念
UTC: 协调世界时间(Coordinated Universal Time), 又称世界统一时间,世界标准时间, 国际协调时间, 简称UTC
GMT: 格林尼治时间, 本初子午线被定义为通过格林尼治经线的位置,相对这条经线线的时间向东递增,向西递减,每隔一个时区,相差一个小时。
时间戳:指从1970年1月1日00时00分00秒到现在的总秒数,也被称为Unix时间戳(Unix Timestamp)。
时区:时区(Time Zone)是地球上的区域使用同一个时间定义,1844年在华盛顿召开国际会议时,为克服时间上的混乱,规定将全球划分为24个时区。中国采用首都北京所在地区所在地东八区(UTC+08:00)的时间做为全国统一使用时间。
时间转换:
1秒(s) = 1000毫秒(ms)
1毫秒(ms) = 1000微秒(us)
1微秒(us) = 1000纳秒(ns)
1 纳秒(ns) = 1000皮秒(ps)
2 SystemTime、LocalTime和FileTime
下面主要针对windows下对系统时间(SystemTime)、本地时间(LocalTime)和文件时间(FileTime)做个简介
系统时间(SystemTime): Windows的系统时间采用格林尼治时间。Windows用结构体SYSTEMTIME来存储系统时间, Windows API GetSystemTime 用于获取当前的系统时间:
SYSTEMTIME st;
GetSystemTime(&st);
本地时间(LocalTime): 本地时间和系统时间一样,也是用结构体SYSTEMTIME 来存储本地时间,本地时间就是系统设置的当前时间。如当前系统设置的时区为UTC+08:00, 那第操作系统右下角显示的时间就是系统的本地时间。Windows API GetLocalTime 用于获取当前系统的本地时间。
SYSTEMTIME st;
GetLocalTime(&st);
文件时间(FileTime): Windows用结构体FILETIME 存储文件时间。文件时间和本地时间、系统时间有个很大的不同点是:文件时间用64位的数据长度存储,记录了从1601年1月1日00时00分00秒到现在以100纳秒(ns)为单位的UTC时间。Windows API SystemTimeToFileTime 用于当系统时间转换为文件时间。
SYSTEMTIME st;
FILETIME ft;
GetSystemTime(&st);
SystemTimeToFileTime(&st, &ft);
3 时间转换
系统时间与文件时间的转换:SystemTimeToFileTime 和 FileTimeToSystemTime
本地时间与文件时间的转换:LocalTimeToFileTime 和 FileTimeToLocalTime
时间戳与文件时间的转换:这儿需要注意,由于时间戳和文件时间的记录起始点和单位都不一样,所以在转换的时候需要做相应的单位换算和增减这两个记录起始点之间的时间间隔。
常量116444736000000000表示从1601年1月1日00时00分00秒到1970年1月1日00时00分00秒的以100ns为单位时间间隔。
#include <windows.h>
void TimeStampToFileTime(INT64 timeStamp, FILETIME& fileTime)
{
INT64 nll = timeStamp * 10000000 + 116444736000000000;
fileTime.dwLowDateTime = (DWORD) nll;
fileTime.dwHighDateTime = nll >> 32;
}
void FileTimeToTimeStamp(const FILETIME& fileTime, INT64& timeStamp)
{
timeStamp = ((INT64)fileTime.dwHighDateTime << 32) + fileTime.dwLowDateTime;
timeStamp = (timeStamp - 116444736000000000) / 10000000;
}