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 结束的字符串的指针,持有如上所述的日期和时间的文本表示。该字符串可以在asctime
和ctime
之间共享,并且可以在每次调用任何这些函数时被覆盖。
2)成功为零,失败时为非零,在这种情况下buf[0]
设置为零(除非buf
是空指针或者bufsz
零或大于RSIZE_MAX
)。
笔记
该函数返回一个指向静态数据的指针,并且不是线程安全的。POSIX将此功能标记为废弃,并推荐strftime
使用。C标准也建议strftime
而不要使用asctime
,asctime_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):