asctime, asctime_s

来自cppreference.com
< c‎ | chrono
定义于头文件 <time.h>
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) 将给定的日历时间 *time_ptr 转换成下列固定的 25 字符文本表示:Www Mmm dd hh:mm:ss yyyy\n
  • Www - 三字母英文星期缩写,来自 time_ptr->tm_wday ,为 MonTueWedThuFriSatSun 之一。
  • Mmm - 三字母英文月份缩写,来自 time_ptr->tm_mon,为 JanFebMarAprMayJunJulAugSepOctNovDec 之一。
  • dd - 月份日期的 2 位数字,来自 time_ptr->tm_mday ,如 sprintf%2d 打印。
  • hh - 小时的 2 位数字,来自 time_ptr->tm_hour ,如 sprintf%.2d 打印。
  • mm - 分的 2 位数字,来自 time_ptr->tm_min ,如 sprintf%.2d 打印。
  • ss - 秒的 2 位数字,来自 time_ptr->tm_sec ,如 sprintf%.2d 打印。
  • yyyy - 年的 4 位数字,来自 time_ptr->tm_year + 1900 ,如 sprintf%4d 打印。
*time_ptr 的任何成员在正常范围外,则行为未定义。
time_ptr->tm_year 所指示的日历年份多于 4 位数字或小于 1000 年,则行为未定义。
此函数不支持本地化,而且换行符无法移除。
此函数修改静态存储,而且是非线程安全的。
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 - 指向指定要打印的时间的 struct tm 对象
buf - 指向用户提供的至少有 26 字节长度的缓冲区
bufsz - 用户提供的缓冲区大小

返回值

1) 返回指针,指向静态空终止字符串,字符串保有如上描述的日期和时间的文本展示。字符串可以在 asctimectime 间共享,并且可以被每次对这些函数的调用重写。
2) 成功时为零,失败时为非零,失败的情况下设置 buf[0] 为零(除非 buf 是空指针或 bufsz 是零或大于 RSIZE_MAX )。

注意

此函数返回指向静态数据的指针,而且是非线程安全的。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 <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 对象转换成自定义文本表示
(函数)