asctime

asctime, asctime_s

在头文件中定义
char * asctime(const struct tm * time_ptr);(1)
errno_t asctime_s(char * buf,rsize_t bufsz,const struct tm * time_ptr);(2)(自C11以来)

1)将给定的日历时间tm转换为以下固定的25个字符格式的文本表示形式:Www Mmm dd hh:mm:ss yyyy\n

  • Www-本周三字母缩写英文从当天time_ptr->tm_wday的一个Mon,Tue,Wed,Thu,Fri,Sat,Sun。

如果任何成员*time_ptr超出其正常范围,则行为是不确定的

如果指示的time_ptr->tm_year日历年份超过4位或小于1000 年,则行为不明确。

该函数不支持本地化,并且不能删除换行符。

The function modifies static storage and is not thread-safe.

2)与(1)相同,不同之处在于消息被复制到用户提供的存储器buf中,并保证以 null 结尾,并且在运行时检测到以下错误并调用当前安装的约束处理函数:

  • buf或者time_ptr是空指针

作为所有边界检查函数,asctime_s只有在被__STDC_LIB_EXT1__实现定义__STDC_WANT_LIB_EXT1__并且1在包含time.h之前用户定义为整数常量时才能保证可用。

参数

time_ptr-指向指定打印时间的tm对象的指针
buf-指向用户提供的缓冲区的指针,长度至少为26个字节
bufsz-用户提供的缓冲区的大小

返回值

1)指向一个静态的以 null 结束的字符串的指针,持有如上所述的日期和时间的文本表示。该字符串可以在asctimectime之间共享,并且可以在每次调用任何这些函数时被覆盖。

2)成功为零,失败时为非零,在这种情况下buf[0]设置为零(除非buf是空指针或者bufsz零或大于RSIZE_MAX)。

笔记

该函数返回一个指向静态数据的指针,并且不是线程安全的。POSIX将此功能标记为废弃,并推荐strftime使用。C标准也建议strftime而不要使用asctimeasctime_s因为strftime它更灵活且对语言环境敏感。

POSIX 限制未定义的行为仅限于输出字符串超过25个字符,timeptr->tm_wday或timeptr->tm_mon不在预期范围内或当timeptr->tm_year超过时INT_MAX-1990。

一些实现处理timeptr->tm_mday==0意味着前一个月的最后一天。

示例

#define __STDC_WANT_LIB_EXT1__ 1 #include <time.h> #include <stdio.h> int main(void) { struct tm tm = *localtime(&(time_t){time(NULL)} printf("%s", asctime(&tm) #ifdef __STDC_LIB_EXT1__ char str[26]; asctime_s(str, sizeof str, &tm printf("%s", str #endif }

可能的输出:

Tue May 26 21:51:50 2015 Tue May 26 21:51:50 2015

参考

  • C11标准(ISO / IEC 9899:2011):