19|其他重要标准库特性实战:利用日历应用熟悉新特性
卢誉声
你好,我是卢誉声。
我们想要提升 C++ 的编程效率,就需要对重要标准库的变更保持关注。在第 18 讲已经涵盖了绝大多数 C++20 带来的重要库变更。不过,我当时有意忽略了其中一个,就是我们今天的主角——C++20 Calendar、Timzone。
它们是对现有 chrono 库的重要补充。Calendar 提供了日历的表示与计算工具。而 Timezone 提供了标准的时区定义,可以构建包含时区信息的 zoned_time。
今天,我会围绕 C++20 Calendar、Timzone 带你进行编程实战,并结合上一讲涵盖的特性:jthread、source location、sync stream 和 u8string,实现一个使用新标准实现的日历程序。
模块设计
我们准备构建的命令行日历应用,具备以下特性。
使用 C++20 chrono:支持显示本月日历,显示日期和星期信息。
使用 u8string:支持导出本年的全年日历到文本文件,编码为 UTF-8。
我们依然采用传统 C++ 模块结构设计,整体模块设计如下图所示。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
C++20标准库的新特性Calendar和Timezone为C++编程带来了重要的补充。本文以实战方式介绍了如何利用这些新特性构建日历应用,并详细讲解了如何改造日志框架以适应多线程环境和记录源代码位置信息。通过实际案例向读者展示了如何利用C++20的新特性构建日历应用,并且通过对Handler、Record和Logger的改造,使日志框架更加适用于多线程环境,并且能够记录源代码位置信息。同时,文章还介绍了对format函数输出sourceLocation信息的修改。 文章通过实际案例向读者展示了如何利用C++20的新特性构建日历应用,并且详细介绍了如何改造日志框架以适应多线程环境和记录源代码位置信息。通过介绍C++20引入的Calendar特性,展示了如何利用它获取当前日期和月份,并通过渲染模块渲染当月日历。同时,还详细讲解了渲染模块的实现细节,包括如何生成日历表头、渲染月份日历和格式化输出周日期等。此外,还介绍了CalendarUtils模块的实现,展示了如何利用Calendar特性生成当月的所有周,大大简化了日期计算的复杂性。 在实现的过程中,还使用了TimeZone获取带时区的本地时间,并通过使用Calendar完成日历计算。这些针对chrono的标准库补充,大大降低了时间处理的复杂度。最后,通过u8string,轻松实现了UTF-8编码的文本导出。 通过这些案例,读者可以感受到,现代 C++的库变更建立在新的核心语言特性基础上,为日常编程工作提供了极大的便利。避免造轮子,提升编程效率——这些对于库的核心变更来说是核心议题,所以我们应该保持对标准库演进的持续关注。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《现代 C++20 实战高手课》,新⼈⾸单¥59
《现代 C++20 实战高手课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(2)
- 最新
- 精选
- 李云龙把本地时间的显示换成UTC时间,只需修改RenderUtils.cpp中的 renderNow() 函数:把chrono::system_clock::now() 替换为 auto utcNow = std::chrono::utc_clock::now(); 同时把时区信息去除。
作者回复: 👍
2024-01-28归属地:北京1 - peterC++20之前没有Calendar吗? 文中“Calendar 是 C++20 引入到 chrono 中新的库特性”,之前没有Calendar吗?有点小怀疑。如果没有,以前是怎么处理日历问题的?
作者回复: 需要基于非常基础的C函数进行封装,没有标准化方案。
2023-03-07归属地:北京
收起评论