先理解以下几个概念:
UTC(universal time coordinated)称为协调时间,协调世界时是以原子时秒长为基础,在时刻上尽量接近于世界时的一种时间计量系统。现在的标准时间——协调世界时(UTC)——由原子钟提供。
格林尼治标准时间(Greenwich Mean Time,GMT)是指位于伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。 理论上来说,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时的时间。由于地球在它的椭圆轨道里的运动速度不均匀,这个时刻可能和实际的太阳时相差16分钟。 地球每天的自转是有些不规则的,而且正在缓慢减速。所以,格林尼治时间已经不再被作为标准时间使用。
Calendar Time:日历时间,是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。无论哪一个时区,在同一时刻对同一个标准时间点来说,日历时间都是一样的。日历时间返回自1970-1-1:00:00:00以来所经过的秒数累计值。因此,不论服务器是在那个时区(国家),同一时刻,日历时间总是一样的,都是相对于1970-1-1:00:00:00以来的秒数。
时区(Time Zone)是地球上的区域使用同一个时间定义。1884年在华盛顿召开国际经度会议时,为了克服时间上的混乱,规定将全球划分为24个时区。为了克服时间上的混乱,1884年在华盛顿召开的一次国际经度会议(又称国际子午线会议)上,规定将全球划分为24个时区(东、西各12个时区)。规定英国(格林尼治天文台旧址)为中时区(零时区)、东1-12区,西1-12区。每个时区横跨经度15度,时间正好是1小时。
Linux常用的时间函数:
asctime, ctime, gmtime, localtime, gettimeofday mktime, asctime_r, ctime_r, gmtime_r, localtime_r
Linux常用时间结构体:
struct tm {
int tm_sec; /* seconds代表目前秒数,正常范围为0-59,但允许至61秒 */
int tm_min; /* minutes 代表目前分数,范围0-59*/
int tm_hour; /* hours从午夜算起的时数,范围为0-23 */
int tm_mday; /* day of the month目前月份的日数,范围01-31 */
int tm_mon; /* month 代表目前月份,从一月算起,范围从0-11*/
int tm_year; /* year 从1900 年算起至今的年数*/
int tm_wday; /* day of the week 一星期的日数,从星期一算起,范围为0-6*/
int tm_yday; /* day in the year 从今年1月1日算起至今的天数,范围为0-365*/
int tm_isdst; /* daylight saving time 日光节约时间的旗标 */
};
struct timeval {
time_t tv_sec; /* seconds (秒)*/
suseconds_t tv_usec; /* microseconds(微秒) */
};
struct timezone {
int tz_minuteswest; /* minutes west of Greenwich 格林威治时间往西方的时差 */
int tz_dsttime; /* type of DST correction 时间的修正方式 */
};
Linux时间函数:
time_t time(time_t *t);
struct tm *localtime_r(const time_t *timep, struct tm *result)
struct tm *gmtime_r(const time_t *timep, struct tm *result);
char *ctime_r(const time_t *timep, char *buf);
将日历时间转换为字符串
time_t mktime(struct tm *tm);
将时间结构体struct tm的值转化为经过日历时间
int gettimeofday(struct timeval *tv, struct timezone *tz);
int settimeofday(const struct timeval *tv, const struct timezone *tz);
获取和设置系统时间