ctime函数用法详解
ctime函数简介
- 头文件包含
#include <time.h>
- 函数定义
char *asctime(const struct tm * tm );
char *asctime_r(const struct tm * tm , char * buf );
char *ctime(const time_t * timep );
char *ctime_r(const time_t * timep , char * buf );
struct tm *gmtime(const time_t * timep );
struct tm *gmtime_r(const time_t * timep , struct tm * result );
struct tm *localtime(const time_t * timep );
struct tm *localtime_r(const time_t * timep , struct tm * result );
time_t mktime(struct tm * tm );
ctime函数常见使用错误
- 编译错误
warning: implicit declaration of function ‘ctime’ [-Wimplicit-function-declaration]
解决办法:包含头文件
#include <time.h>
ctime函数详细描述
ctime ()、gmtime ()和localtime ()函数都采用数据类型time_t的参数,该参数表示日历时间。当被解释为绝对时间值时,它表示自1970-01-01 00:00:00+0000(UTC)以来经过的秒数。
asctime ()和mktime ()函数都接受一个表示分解时间的参数,分解时间是一个分为年、月、日等的表示形式。
分解时间存储在结构tm中,该结构在
struct tm {
int tm_sec; /* Seconds (0\-60) */
int tm_min; /* Minutes (0\-59) */
int tm_hour; /* Hours (0\-23) */
int tm_mday; /* Day of the month (1\-31) */
int tm_mon; /* Month (0\-11) */
int tm_year; /* Year \- 1900 */
int tm_wday; /* Day of the week (0\-6, Sunday = 0) */
int tm_yday; /* Day in the year (0\-365, 1 Jan = 0) */
int tm_isdst; /* Daylight saving time */
};
tm结构的成员是:
- tm_sec分钟后的秒数,通常在0到59的范围内,但可以最多60秒,以允许闰秒。
- tm_min小时后的分钟数,范围为0到59。
- tm_hour午夜后的小时数,范围为0到23。
- tm_mday一个月中的某一天,在1到31的范围内。
- tm_mon自1月份以来的月份数,在0到11之间。
- 1900年以来的年数。
- tm_wday自周日以来的天数,范围为0到6。
- tm_yday自1月1日以来的天数,范围在0到365之间。
- tm_isdst指示夏时制是否在描述的时间生效的标志。如果夏令时生效,则该值为正值;如果不生效,则为零;如果信息不可用,则为负值。
call.bi ctime(t)等效于.bi asctime(localtime(t))\fr。它将日历时间t转换为表单的以空结尾的字符串
"Wed Jun 30 21:49:08 1993\en"
一周中几天的缩写是“sun”、“mon”、“tue”、“wed”、“thu”、“frii”和“sat”。月份之简称为“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”及“十二月”。返回值指向一个静态分配的字符串,该字符串可能会被对任何日期和时间函数的后续调用所覆盖。该函数还设置外部变量tzname、timezone和daylight(有关当前时区的信息请参见tzset (3))。可重入版本ctime_r ()执行相同操作,但将字符串存储在用户提供的缓冲区中,该缓冲区至少应有26个字节的空间。它不需要设置tzname、ppp3和ppp4。
gmtime ()函数将日历时间timep转换为分解的时间表示,以协调世界时(UTC)表示。当年份不适合整数时,它可能返回NULL。返回值指向一个静态分配的结构,该结构可能会被对任何日期和时间函数的后续调用所覆盖。gmtime_r ()函数执行相同的操作,但将数据存储在用户提供的结构中。
localtime ()函数将日历时间timep转换为相对于用户指定时区表示的分解时间表示形式。该函数的作用就像调用了tzset (3)一样,并将外部变量tzname设置为当前时区的信息,timezone设置为协调世界时(UTC)和本地标准时间之间的差(以秒为单位),如果夏令时规则在一年中的某个部分应用,则daylight设置为非零值。返回值指向一个静态分配的结构,该结构可能会被对任何日期和时间函数的后续调用所覆盖。localtime_r ()函数执行相同的操作,但将数据存储在用户提供的结构中。它不需要设置tzname、timezone和daylight。
asctime ()函数将分解后的时间值tm转换为以null结尾的字符串,其格式与ctime ()相同。返回值指向静态分配的字符串,该字符串可能会被随后对任何日期和时间函数的调用所覆盖。asctime_r ()函数执行相同的操作,但将字符串存储在用户提供的缓冲区中,该缓冲区至少应有26字节的空间。
mktime ()函数将分解的时间结构(表示为本地时间)转换为日历时间表示。函数忽略调用方在tm_wday和tm_yday字段中提供的值。tm_isdst字段中指定的值通知mktime ()夏时制是否对tm结构中提供的时间有效:正值表示夏时制有效;零表示DST不生效;负值表示mktime ()应该(使用时区信息和系统数据库)尝试确定DST是否在指定时间生效。
mktime ()函数修改tm结构的字段如下:tm_wday和tm_yday被设置为从其他字段的内容中确定的值;如果结构成员在其有效间隔之外,将对其进行归一化(例如,10月40号改为11月9日);tm_isdst被分别设置为(不管其初始值如何)正值或0,以指示DST在指定时间是否有效。调用mktime ()还将外部变量tzname设置为有关当前时区的信息。
如果指定的分解时间不能表示为日历时间(从纪元开始的秒),mktime ()返回(time_t)\ -1,并且不改变分解时间结构的成员。
ctime函数返回值
成功后,gmtime ()和localtime ()返回一个指向"struct\ tm" 的指针
成功后,gmtime_r ()和localtime_r ()返回result 指向的结构的地址
成功后,asctime ()和ctime ()返回一个指向字符串的指针。
成功后,asctime_r ()和ctime_r ()返回一个指针,指向buf 所指向的字符串
成功后,mktime ()返回日历时间(从纪元开始的秒数),表示为time_t 类型的值
错误时,mktime ()返回值"(time_t)\ -1" ,其余函数错误时返回NULL。在错误时,errno被设置为指示错误的原因。
ctime函数错误码
- EOVERFLOW 无法表示结果。
ctime函数其他说明
四个函数asctime ()、ctime ()、gmtime ()和localtime ()返回静态数据的指针,因此不是线程安全的。线程安全版本,asctime_r (),ctime_r (),gmtime_r ()和localtime_r ()是由susv2指定的。
POSIX.1-2001指出:“asctime ()、ctime ()、gmtime ()和localtime ()函数将返回两个静态对象之一的值:分解的时间结构和char 类型的数组。任何函数的执行都可能覆盖任何其他函数在这些对象中返回的信息。”这可能发生在glibc实现中。
在包括glibc在内的许多实现中,tm_mday中的0被解释为前一个月的最后一天。
struct tm的glibc版本有其他字段
const char *tm_zone; /* Timezone abbreviation */
在包含
根据POSIX.1-2001,要求localtime ()的行为就像调用了tzset (3)一样,而localtime_r ()没有这个要求。对于可移植代码,应该在localtime_r ()之前调用tzset (3)
评论区