std::asctime

来自cppreference.com
< cpp‎ | chrono‎ | c
 
 
工具库
语言支持
类型支持(基本类型、RTTI)
库功能特性测试宏 (C++20)
动态内存管理
程序工具
协程支持 (C++20)
变参数函数
调试支持
(C++26)
三路比较
(C++20)
(C++20)(C++20)(C++20)
(C++20)(C++20)(C++20)
通用工具
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)(C++20)(C++20)   
(C++20)
交换类型运算
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
常用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
初等字符串转换
(C++17)
(C++17)

 
 
 
在标头 <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 —— 2 位月内日期,来自 timeptr->tm_mday,如同 sprintf%2d 打印
  • hh —— 2 位小时,来自 timeptr->tm_hour,如同 sprintf%.2d 打印
  • mm —— 2 位分,来自 timeptr->tm_min,如同 sprintf%.2d 打印
  • ss —— 2 位秒,来自 timeptr->tm_sec,如同 sprintf%.2d 打印
  • yyyy —— 4 位年,来自 timeptr->tm_year + 1900,如同 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 输出:
        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)
按照指定格式格式化并输出日期/时间值
(函数模板)