ctime, ctime_s

来自cppreference.com
< c‎ | chrono
定义于头文件 <time.h>
char* ctime( const time_t* time );
(1)
errno_t ctime_s(char *buffer, rsize_t bufsz, const time_t *time);
(2) (C11起)
1) 将指定的从纪元开始时间转换成本地日历时间,然后再变成文本展示,如同调用asctime(localtime(time))
2)(1),除了此函数等价于asctime_s(buffer, bufsz, localtime_s(time, &(struct tm){0})),而且运行时会检测下列错误,并调用当前安装的强制处理函数:
  • buffertime是空指针
  • bufsz小于26或大于RSIZE_MAX
如同所有边界检查函数,ctime_s只保证实现定义了__STDC_LIB_EXT1__且用户在包含time.h前将__STDC_WANT_LIB_EXT1__定义为整数常量1情况下可用。

产生的字符串拥有如下格式:

Www Mmm dd hh:mm:ss yyyy\n
  • Www - 星期(MonTueWedThuFriSatSun之一)。
  • Mmm - 月份(JanFebMarAprMayJunJulAugSepOctNovDec之一)。
  • dd - 月的日期
  • hh - 时
  • mm - 分
  • ss - 秒
  • yyyy - 年

本函数不支持本地化。

目录

[编辑] 参数

time - 指向指定要打印时间的time_t对象
buffer - 指向至少有bufsz大小的char数组元素的指针
bufsz - 输出的最大字节数,典型是buffer所指向的缓冲区大小

[编辑] 返回值

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

[编辑] 注意

ctime返回指向静态数据的指针,而且是非线程安全的。另外它修改可能会为gmtimelocaltime所共享的静态struct tm对象。POSIX将此函数标为落后,并推荐strftime以替代。C标准亦推荐用strftime替代asctimeasctime_s,因为strftime更有弹性,并且是关乎本地环境的。

对于导致字符串长于25字符(例如,10000年)的time_t的值,ctime的行为可能是未定义的。

[编辑] 示例

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

输出:

Tue May 26 21:51:03 2015
Tue May 26 21:51:03 2015

[编辑] 参考

  • C11 standard (ISO/IEC 9899:2011):
  • 7.27.3.2 The ctime function (p: 393)
  • K.3.8.2.2 The ctime_s function (p: 626)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.23.3.2 The ctime function (p: 342)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 4.12.3.2 The ctime function

[编辑] 参阅

struct tm对象转换成文本展示
(函数) [edit]
struct tm对象转换成自定义文本展示
(函数) [edit]
ctimeC++文档