命名空间
变体
操作

std::asctime

来自 cppreference.cn
< cpp‎ | chrono‎ | c
 
 
 
 
定义于头文件 <ctime>
char* asctime( const std::tm* time_ptr );

将给定的日历时间 std::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 年,则行为未定义。

此函数不支持本地化,并且换行符无法移除。

此函数修改静态存储,并且不是线程安全的。

内容

[编辑] 参数

time_ptr - 指向 std::tm 对象的指针,该对象指定要打印的时间

[编辑] 返回值

指向静态空终止字符字符串的指针,该字符串保存日期和时间的文本表示。该字符串可能在 std::asctimestd::ctime 之间共享,并且可能在每次调用这些函数中的任何一个时被覆盖。

[编辑] 注释

此函数返回指向静态数据的指针,并且不是线程安全的。POSIX 将此函数标记为过时,并建议使用依赖于区域设置的 std::strftime 代替。在 std::locale("C") 中,std::strftime 格式字符串 "%c\n" 将与 std::asctime 输出完全匹配,而在其他区域设置中,格式字符串 "%a %b %e %H:%M:%S %Y\n" 将是可能更接近但不总是完全匹配的。

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

一些实现将 timeptr->tm_mday == 0 处理为表示上个月的最后一天。

[编辑] 示例

#include <ctime>
#include <iomanip>
#include <iostream>
 
int main()
{
    const std::time_t now = std::time(nullptr);
 
    for (const char* localeName : {"C", "en_US.utf8", "de_DE.utf8", "ja_JP.utf8"})
    {
        std::cout << "locale " << localeName << ":\n" << std::left;
        std::locale::global(std::locale(localeName));
 
        std::cout << std::setw(40) << "    asctime" << std::asctime(std::localtime(&now));
 
        // strftime output for comparison:
        char buf[64];
        if (strftime(buf, sizeof buf, "%c\n", std::localtime(&now)))
            std::cout << std::setw(40) << "    strftime %c" << buf;
 
        if (strftime(buf, sizeof buf, "%a %b %e %H:%M:%S %Y\n", std::localtime(&now)))
            std::cout << std::setw(40) << "    strftime %a %b %e %H:%M:%S %Y" << buf;
 
        std::cout << '\n';
    }
}

可能的输出

locale C:
    asctime                             Wed Nov  4 00:45:01 2020
    strftime %c                         Wed Nov  4 00:45:01 2020
    strftime %a %b %e %H:%M:%S %Y       Wed Nov  4 00:45:01 2020
 
locale en_US.utf8:
    asctime                             Wed Nov  4 00:45:01 2020
    strftime %c                         Wed 04 Nov 2020 12:45:01 AM UTC
    strftime %a %b %e %H:%M:%S %Y       Wed Nov  4 00:45:01 2020
 
locale de_DE.utf8:
    asctime                             Wed Nov  4 00:45:01 2020
    strftime %c                         Mi 04 Nov 2020 00:45:01 UTC
    strftime %a %b %e %H:%M:%S %Y       Mi Nov  4 00:45:01 2020
 
locale ja_JP.utf8:
    asctime                             Wed Nov  4 00:45:01 2020
    strftime %c                         2020年11月04日 00時45分01秒
    strftime %a %b %e %H:%M:%S %Y       水 11月  4 00:45:01 2020

[编辑] 参见

std::time_t 对象转换为文本表示
(函数) [编辑]
std::tm 对象转换为自定义文本表示
(函数) [编辑]
(C++11)
根据指定的格式格式化和输出日期/时间值
(函数模板) [编辑]
C 文档 for asctime