C++ 获取系统当前的日期(YYYYMMDD)

梦晨同学_8049

梦晨同学_8049

2026-08-21

198人浏览

原创

c++oding="utf-8" ?>

最简洁可靠的是 std::chrono + std::format(c++20):用 system_clock::now() 获取时间,配合 format("{:%y%m%d}", local) 格式化;c++20 需本地时区时可用 localtime 替代 current_zone;兼容性首选 strftime,注意线程安全与缓冲区检查;避免 getlocaltime 与时区不一致问题。

c++ 获取系统当前的日期(yyyymmdd)

std::chrono + std::format(C++20)最简洁可靠

如果你的编译器支持 C++20 且启用了 std::format(如 MSVC 19.3x+、GCC 13+、Clang 16+),这是目前最干净的方式:直接获取系统时钟时间并格式化为 "YYYYMMDD" 字符串,无需手动拆解年月日,也规避了 localtime 的线程不安全问题。

实操建议:

C++ 算法竞赛自动化测试数据生成与校验框架
C++ 算法竞赛自动化测试数据生成与校验框架

根据原题生成新题面、验证器及完整测试数据,自动套用 testlib 模板,用于用户要求生成测试数据时。

下载
  • 确保编译选项开启 C++20(如 -std=c++20)且启用 std::format(GCC/Clang 可能需额外链接 -lstdc++fs 或确认标准库支持)
  • std::chrono::system_clock::now() 获取的是 UTC 时间;若需本地时区,必须先转换——std::chrono 本身不提供时区转换,得靠 std::format%Y%m%d 格式配合 std::chrono::current_zone()->to_local(...)(C++23)或退而求其次用 std::localtime
  • 示例代码:
    auto now = std::chrono::system_clock::now();
    auto local = std::chrono::current_zone()->to_local(now); // C++23
    std::string yyyymmdd = std::format("{:%Y%m%d}", local);
    注意:C++23 才有 current_zone,C++20 下此行会编译失败

std::localtime + std::strftime(C++11 起通用)

兼容性最好,所有主流编译器都支持,但要注意 std::localtime 返回静态缓冲区指针,不是线程安全的;多线程下必须加锁或改用 std::localtime_r(POSIX)或 std::localtime_s(MSVC)。

常见错误现象:std::strftime 返回 0 表示缓冲区不足或格式非法,但很多人忽略返回值,导致得到空字符串。

实操建议:

  • 分配足够大的缓冲区("YYYYMMDD" 固定 8 字符,但加上终止符需至少 9 字节;建议用 char buf[16] 防溢出)
  • 先调用 std::time(nullptr) 获取 time_t,再传给 std::localtime(注意检查返回是否为 nullptr
  • 格式字符串必须是 "%Y%m%d":其中 %Y 是 4 位年份,%m 是补零月份,%d 是补零日期;写成 "%y%m%d" 会得到两位年份(如 "240520"),不符合要求
  • 示例:
    std::time_t t = std::time(nullptr);
    std::tm* lt = std::localtime(&t);
    if (lt) {
        char buf[16];
        if (std::strftime(buf, sizeof(buf), "%Y%m%d", lt)) {
            std::string yyyymmdd(buf);
        }
    }

Windows 下避免 GetLocalTime 的陷阱

Win32 API 的 GetLocalTime 看似方便,但它返回的是系统当前时区的本地时间,**不经过夏令时自动修正**——如果系统时区设置了夏令时规则,而当前处于标准时间/夏令时间切换窗口附近,SYSTEMTIME 中的 wYear/wMonth/wDay 可能错乱。更严重的是,它完全绕过了 C 运行时的时区设置(如 _putenv("TZ=...")),和 std::localtime 行为不一致。

使用场景:仅当你已明确放弃跨平台、且确定系统时区配置稳定、无需考虑运行时 TZ 变更时才考虑。

实操建议:

  • 不要直接拼接 wYearwMonthwDay 字段转字符串——它们是 WORD 类型,需格式化为两位宽(%02d)否则可能输出 "2024520" 这类无分隔、不补零的结果
  • 若需严格匹配 std::localtime 行为,仍应优先调用 std::localtime,哪怕在 Windows 上
  • 示例(不推荐但可理解):
    SYSTEMTIME st;
    GetLocalTime(&st);
    char buf[16];
    snprintf(buf, sizeof(buf), "%04d%02d%02d", st.wYear, st.wMonth, st.wDay);

为什么不用 std::put_time

std::put_time 看起来是 std::strftime 的流式替代,但它的底层仍依赖 std::strftime,且对输出目标有限制:只能写入 std::basic_ostream,无法直接生成 std::string。这意味着你得先写进 std::ostringstream 再取 str(),多一次内存拷贝;更关键的是,它不返回成功与否的状态码,错误(如缓冲区满)会被静默吞掉,调试困难。

性能 / 兼容性影响:

  • 在嵌入式或资源受限环境,std::ostringstream 构造开销明显大于固定大小字符数组
  • 某些旧版 libstdc++(GCC 7 之前)中 std::put_time 实现有 bug,对 %Y 处理异常
  • 如果你已经用 std::strftime 并检查了返回值,就没必要换 std::put_time

真正容易被忽略的是时区一致性:同一进程里混用 std::localtimeGetLocalTimestd::chrono::system_clock::now() 三种方式,结果可能因系统时区缓存、TZ 环境变量生效时机不同而出现 1 天偏差。选一种,贯彻到底。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++ c++时间戳 yy

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2088

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

959

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

367

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

307

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

366

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

560

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1389

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1177

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1305

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习