C 参考手册

位置:首页 > C 参考手册 >日期和时间工具 > asctime, asctime_r, asctime_s

定义于头文件 <time.h>
char*   asctime  ( const struct tm* time_ptr );
(1)
char*   asctime_r( const struct tm* time_ptr, char* buf );
(2) (C2x 起)
errno_t asctime_s( char* buf, rsize_t bufsz, const struct tm* time_ptr );
(3) (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 的 2 位月之日,如同由 sprintf%2d 打印
  • hh ——来自 timeptr->tm_hour 的 2 位时,如同由 sprintf%.2d 打印
  • mm ——来自 timeptr->tm_min 的 2 位分,如同由 sprintf%.2d 打印
  • ss ——来自 timeptr->tm_sec 的 2 位秒,如同由 sprintf%.2d 打印
  • yyyy ——来自 timeptr->tm_year + 1900 的 4 位年,如同由 sprintf%4d 打印
*time_ptr 的任何成员在其正常范围外则行为未定义
time_ptr->tm_year 所指示的历年拥有多于 4 位数或小于 1000 年则行为未定义。
函数不支持本地化,且不能移除换行符。
函数修改静态存储且非线程安全。
2)(1) ,除了写入消息到用户提供的存储 buf 中,保证它是空终止的。
若存储始于 buf 的可用大小小于 26 字节则行为未定义。
3)(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 ,在返回后指向保有如上描述的日期与时间的静态空终止字符串。
3) 成功时为零,失败时为非零,并设置 buf[0] 为零(除非 buf 为空指针或 bufsz 为零或大于 RSIZE_MAX )。

注解

asctime 返回指向静态数据的指针从而不是线程安全的。 POSIX 标记此函数为过时并推荐用 strftime 代替。 C 标准亦推荐用 strftime 代替 asctimeasctime_rasctime_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 <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 standard (ISO/IEC 9899:2011):
  • 7.27.2.1 The asctime function (p: 392-393)
  • K.3.8.2.1 The asctime_s function (p: 624-625)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.23.3.1 The asctime function (p: 341-342)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 4.12.3.1 The asctime function

参阅

struct time_t 对象转换成文本表示
(函数)
struct tm 对象转换成自定义文本表示
(函数)