日常编程过程中经常会用到日期和时间,我们常常需要对日期和时间进行转换和处理,C语言time.h中为我们提供了这些函数。
一、时间的概念
通用协调时间(UTC, Universal Time Coordinated):是一个全球通用的时间标准,使用秒来计算。
格林尼治平均时(GMT, Greenwich Mean Time):基本上等同于UTC时间。
本地时间:整个地球分为24时区,本地时间是结合各地的时区进行计算的。本地时间 = UTC + 时区差,时区差东为正,西为负,比如北京为东八区,则时区差为+8。
Unix时间戳:在计算机中看到的UTC时间都是从(1970年01月01日 0:00:00)开始计算秒数的。所看到的UTC时间那就是从1970年这个时间点起到具体时间共有多少秒。 这个秒数就是Unix时间戳。
二、时间的数据类型
time_t :这个是用来存储unix时间戳的类型,大部分系统是定义为long型。
struct tm:一个用来保存时间和日期的结构。
struct tm {int tm_sec; /* 秒,范围从 0 到 59 */int tm_min; /* 分,范围从 0 到 59 */int tm_hour; /* 小时,范围从 0 到 23 */int tm_mday; /* 一月中的第几天,范围从 1 到 31 */int tm_mon; /* 月,范围从 0 到 11(注意) */int tm_year; /* 自 1900 年起的年数 */int tm_wday; /* 一周中的第几天,范围从 0 到 6 */int tm_yday; /* 一年中的第几天,范围从 0 到 365 */int tm_isdst; /* 夏令时 */
};
struct timeval:一个保存秒和微妙信息的结构。
struct timeval {long tv_sec; //秒long tv_usec; //微秒
};
struct timezone:一个保存时区信息的结构
struct timezone {int tz_minuteswest; /*和Greenwich 时间差了多少分钟*/int tz_dsttime; /* 夏令时*/
};
三、时间的函数
函数 | 说明 |
---|---|
time | 获取当前经过的秒数 |
gmtime | 获取当前时间和日期 |
localtime | 获取当前时间和日期并转换为本地时间 |
timegm | 从tm时间转换到time_t时间,不考虑时区 |
timelocal | 从tm时间转换到time_t时间,考虑时区 |
mktime | 将时间转换成经过的秒数 |
asctime | 将时间日期以字符串格式表示 |
ctime | 将时间日期以字符串格式表示 |
gettimeofday | 获取当前时间 |
settimeofday | 设置当天时间戳 |
1、time
头文件:time.h
原型:time_t time(time_t *t);
说明:此函数会返回从公元 1970 年1 月1 日的UTC 时间从0 时0 分0 秒算起到现在所经过的秒数。如果t 并非空指针的话,此函数也会将返回值存到t 指针所指的内存。
返回值:成功则返回秒数,失败则返回((time_t)-1)值,错误原因存于errno 中。
示例
#include <stdio.h>
#include <time.h>int main() {int seconds = time(NULL);printf("seconds:%ld\n", seconds);return 0;
}
2、gmtime
头文件:time.h
原型:struct tm *gmtime(const time_t *timep);
说明:gmtime()将参数timep 所指的time_t 中的信息转换成真实世界所使用的时间日期表示方法,然后将结果由结构tm 返回。此函数返回的时间日期未经时区转换,是UTC 时间。
返回值:返回结构tm 代表目前UTC 时间。
示例
#include <stdio.h>
#include <time.h>int main() {char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};time_t timep;struct tm *p;time(&timep);p = gmtime(&timep);printf("%d/%d/%d ", (p->tm_year+1900), (p->tm_mon+1), p->tm_mday);printf("%s %d:%d:%d\n", wday[p->tm_wday], p->tm_hour, p->tm_min, p->tm_sec);return 0;
}
3、localtime
头文件:time.h
原型:struct tm *localtime(const time_t * timep);
说明:localtime()将参数timep 所指的time_t 结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果由结构tm 返回。此函数返回的时间日期已经转换成当地时区。
返回值:返回结构tm 代表目前的当地时间。
示例
#include <stdio.h>
#include <time.h>int main() {char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};time_t timep;struct tm *p;time(&timep);p = localtime(&timep); //取得当地时间printf("%d/%d/%d ", (p->tm_year+1900), (p->tm_mon+1), p->tm_mday);printf("%s %d:%d:%d\n", wday[p->tm_wday], p->tm_hour, p->tm_min, p->tm_sec);return 0;
}
4、timegm
头文件:time.h
原型:time_t timegm(struct tm *tm);
说明:gmtime()将参数tm所指的struct tm 中的信息转换成time_t 表示方法,然后将结果由time_t 返回。此函数返回的时间未经时区转换,是UTC 时间。
返回值:返回time_t 代表目前UTC 时间。
示例
#include <stdio.h>
#include <time.h>int main() {time_t timep;struct tm *p;time(&timep);printf("time():%ld \n", timep);p = localtime(&timep);timep = timegm(p);printf("time()->localtime()->timegm():%ld\n", timep);return 0;
}
5、timelocal
头文件:time.h
原型:time_t timelocal(struct tm *tm);
说明:timelocal()将参数tm所指的struct tm 中的信息转换成time_t 表示方法,然后将结果由time_t 返回。此函数返回的时间日期已经转换成当地时区。
返回值:返回time_t 代表目前本地 时间。
示例
#include <stdio.h>
#include <time.h>int main() {time_t timep;struct tm *p;time(&timep);printf("time():%ld \n", timep);p = localtime(&timep);timep = timelocal(p);printf("time()->localtime()->timelocal():%ld\n", timep);return 0;
}
6、mktime
头文件:time.h
原型:time_t mktime(strcut tm * timeptr);
说明:mktime()用来将参数timeptr 所指的tm 结构数据转换成从公元1970 年1 月1 日0 时0 分0 秒算起至今的UTC 时间所经过的秒数。
返回值:返回经过的秒数。
示例
#include <stdio.h>
#include <time.h>int main() {time_t timep;struct tm *p;time(&timep);printf("time():%ld \n", timep);p = localtime(&timep);timep = mktime(p);printf("time()->localtime()->mktime():%ld\n", timep);return 0;
}
7、asctime
头文件:time.h
原型:char *asctime(const struct tm * timeptr);
说明:asctime()将参数timeptr 所指的tm 结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果以字符串形态返回。字符串格式为:“Tue Jun 1 18:10:22 2021”
返回值:返回一字符串表示目前时间日期。
示例
#include <stdio.h>
#include <time.h>int main() {time_t timep;time(&timep);printf("%s", asctime(gmtime(&timep)));return 0;
}
8、ctime
头文件:time.h
原型:char *ctime(const time_t *timep);
说明:ctime()将参数timep 所指的time_t 的信息转换成真实世界所使用的时间日期表示方法,然后将结果以字符串形态返回。此函数已经由时区转换成当地时间,字符串格式为:“Tue Jun 1 18:10:22 2021”
返回值:返回一字符串表示目前当地的时间日期。
示例
#include <stdio.h>
#include <time.h>int main() {time_t timep;time(&timep);printf("%s", ctime(&timep));return 0;
}
9、gettimeofday
头文件:sys/time.h和unistd.h
原型:int gettimeofday (struct timeval * tv, struct timezone * tz);
说明:gettimeofday()会把目前的时间有tv 所指的结构返回,当地时区的信息则放到tz 所指的结构中。
返回值:成功则返回0,失败返回-1,错误代码存于errno。
示例
#include <sys/time.h>
#include <unistd.h>
#include <stdio.h>int main() {struct timeval tv;struct timezone tz;gettimeofday(&tv, &tz);printf("tv_sec:%ld\n", tv.tv_sec);printf("tv_usec:%ld\n", tv.tv_usec);printf("tz_minuteswest:%d\n", tz.tz_minuteswest);printf("tz_dsttime:%d\n", tz.tz_dsttime);return 0;
}
10、settimeofday
头文件:sys/time.h和unistd.h
原型:int settimeofday(const struct timeval *tv, const struct timezone *tz);
说明:settimeofday()会把目前时间设成由tv 所指的结构信息,当地时区信息则设成tz 所指的结构。
返回值:成功则返回0,失败返回-1,错误代码存于errno。
示例
#include <sys/time.h>
#include <unistd.h>
#include <stdio.h>int main() {struct timeval tv;struct timezone tz;gettimeofday(&tv, &tz);printf("tv_sec:%ld\n", tv.tv_sec);printf("tv_usec:%ld\n", tv.tv_usec);printf("tz_minuteswest:%d\n", tz.tz_minuteswest);printf("tz_dsttime:%d\n", tz.tz_dsttime);tv.tv_sec += 3600;settimeofday(&tv, &tz);gettimeofday(&tv, &tz);printf("tv_sec:%ld\n", tv.tv_sec);printf("tv_usec:%ld\n", tv.tv_usec);printf("tz_minuteswest:%d\n", tz.tz_minuteswest);printf("tz_dsttime:%d\n", tz.tz_dsttime);return 0;
}