命名空间
变体
操作

asctime, asctime_s

来自 cppreference.com
< c‎ | chrono
定义在头文件 <time.h>
(1)
char*                asctime( const struct tm* time_ptr );
(直到 C23)
[[已弃用]] char* asctime( const struct tm* time_ptr );
(自 C23 起)
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 获取的星期几的英文缩写,其中之一是 MonTueWedThuFriSatSun
  • Mmm - 从 time_ptr->tm_mon 获取的月份的英文缩写,其中之一是 JanFebMarAprMayJunJulAugSepOctNovDec
  • dd - 从 timeptr->tm_mday 获取的两位数的月份中的日期,就好像使用 %2dsprintf 打印一样。
  • hh - 从 timeptr->tm_hour 获取的两位数的小时,就好像使用 %.2dsprintf 打印一样。
  • mm - 从 timeptr->tm_min 获取的两位数的分钟,就好像使用 %.2dsprintf 打印一样。
  • ss - 从 timeptr->tm_sec 获取的两位数的秒,就好像使用 %.2dsprintf 打印一样。
  • yyyy - 从 timeptr->tm_year + 1900 获取的四位数的年份,就好像使用 %4dsprintf 打印一样。
如果 *time_ptr 的任何成员超出其正常范围,则行为未定义。
如果 time_ptr->tm_year 指示的日历年超过 4 位数字或小于 1000 年,则行为未定义。
该函数不支持本地化,并且换行符无法删除。
该函数修改静态存储,不是线程安全的。
此函数已弃用,在新代码中不应使用。
(自 C23 起)
2)(1) 相同,只是消息被写入用户提供的存储空间 buf 中,该存储空间保证以空字符结尾,并且以下错误在运行时被检测到,并调用当前安装的 约束处理程序 函数
  • buftime_ptr 是空指针
  • bufsz 小于 26 或大于 RSIZE_MAX
  • *time_ptr 的所有成员都不在它们的正常范围内
  • time_ptr->tm_year 指示的年份小于 0 或大于 9999。
与所有边界检查函数一样,asctime_s 只有在实现定义了 __STDC_LIB_EXT1__ 并且用户在包含 <time.h> 之前将 __STDC_WANT_LIB_EXT1__ 定义为整数常量 1 时,才能保证可用。

内容

[编辑] 参数

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

[编辑] 返回值

1) 指向静态空字符结尾的字符串的指针,该字符串包含如上所述的日期和时间的文本表示形式。该字符串可能在 asctimectime 之间共享,并且可能在每次调用这些函数中的任何一个时被覆盖。
2) 成功时为零,失败时为非零,在这种情况下,buf[0] 设置为零(除非 buf 是空指针或 bufsz 为零或大于 RSIZE_MAX)。

[编辑] 备注

asctime 返回指向静态数据的指针,不是线程安全的。POSIX 将此函数标记为已过时,并建议改为使用 strftime。C 标准也建议使用 strftime 而不是 asctimeasctime_s,因为 strftime 更灵活且对区域设置敏感。

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

一些实现将 timeptr->tm_mday == 0 视为前一个月的最后一天。

[编辑] 示例

#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <time.h>
 
int main(void)
{
    struct tm tm = *localtime(&(time_t){time(NULL)});
    printf("%s", asctime(&tm)); // note implicit trailing '\n'
 
#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

[编辑] 参考文献

  • C17 标准 (ISO/IEC 9899:2018)
  • 7.27.2.1 asctime 函数 (p: 287)
  • K.3.8.2.1 asctime_s 函数 (p: 453-454)
  • C11 标准 (ISO/IEC 9899:2011)
  • 7.27.2.1 asctime 函数 (p: 392-393)
  • K.3.8.2.1 asctime_s 函数 (p: 624-625)
  • C99 标准 (ISO/IEC 9899:1999)
  • 7.23.3.1 asctime 函数 (p: 341-342)
  • C89/C90 标准 (ISO/IEC 9899:1990)
  • 4.12.3.1 asctime 函数

[编辑] 另请参阅

(C23 中已弃用)(C11)
time_t 对象转换为文本表示形式
(函数) [编辑]
tm 对象转换为自定义文本表示形式
(函数) [编辑]
C++ 文档 for asctime