当前位置: 首页 > article >正文

c++20 在 <chrono> 中的 日历 和 时区 库

文章目录

      • 1\. 日历功能
        • 基本日期单位
        • 复杂日期表达
        • 示例代码
      • 2\. 时区功能
        • 时区数据库
        • 示例代码
      • 3\. 格式化与输出
      • 替代方案

C++20 的 <chrono> 库在 C++11 的基础上进行了重大扩展,引入了日历和时区功能,极大地增强了对日期和时间的处理能力。

1. 日历功能

C++20 的日历功能提供了类型安全的日期操作接口,包括基本的日期单位(如年、月、日)以及更复杂的日期表达方式。

基本日期单位
  • 年(year)、月(month)、日(day:提供了单独的年、月、日的表示和操作。
  • 星期(weekday:表示一周中的某一天,支持加减运算和格式化输出。
  • 日期组合(year_month_day:可以表示具体的日期,支持加减运算和格式化输出。
复杂日期表达
  • weekday_indexedweekday_last:表示某个月的第几个星期几或最后一个星期几。
  • year_month_weekdayyear_month_weekday_last:用于表示某年某月的特定星期几。
示例代码
#include <iostream>
#include <chrono>
#include <format>

using namespace std::chrono;

int main() {
    year y{2025};
    month m{1};
    day d{21};
    year_month_day date{y, m, d};
    std::cout << "Date: " << std::format("{:%Y-%m-%d}\n", date);  // 输出 2025-01-21

    auto next_month = date + months{1};  // 加一个月
    std::cout << "Next month: " << std::format("{:%Y-%m-%d}\n", next_month);

    return 0;
}

2. 时区功能

C++20 的时区功能基于 IANA 时区数据库,提供了灵活的时区转换和操作。

时区数据库
  • 使用 std::chrono::get_tzdb() 获取当前的时区数据库。
  • 可以通过 locate_zone() 获取特定时区。
示例代码
#include <iostream>
#include <chrono>
#include <format>

using namespace std::chrono;

int main() {
    const auto& tzdb = get_tzdb();  // 获取时区数据库
    for (const auto& zone : tzdb.zones) {
        std::cout << zone.name() << std::endl;  // 输出所有时区名称
    }

    auto* hk = locate_zone("Asia/Hong_Kong");  // 获取香港时区
    auto now = system_clock::now();
    zoned_time zt{hk, now};  // 创建带时区的时间对象
    std::cout << "Current time in Hong Kong: " << zt << '\n';

    return 0;
}

3. 格式化与输出

C++20 的 <chrono> 库支持通过 std::format 对日期和时间进行格式化输出。例如:

std::cout << std::format("{:%Y-%m-%d %H:%M:%S}\n", zt);  // 格式化输出带时区的时间

替代方案

如果编译器尚未完全支持 C++20 的 <chrono> 库,可以考虑使用第三方库,如 date.h(由 C++ 标准库的维护者 Howard Hinnant 编写),它提供了类似的功能。

C++20 的 <chrono> 库为日期和时间的处理提供了强大的支持,结合日历和时区功能,可以满足大多数开发需求。


http://www.kler.cn/a/578505.html

相关文章:

  • cmd中有cl但是conda虚拟环境没用cl
  • 【Recon】Git源代码泄露题目解题方法
  • Java在word中动态增加表格行并写入数据
  • 中级网络工程师面试题参考示例(4)
  • 以太网口的协议与电路波形
  • Scaled_dot_product_attention(SDPA)使用详解
  • Web3 与去中心化技术:如何改变数据所有权
  • C语言数据结构:链表的操作实现
  • STM32全系大阅兵(1)
  • Java Lambda 表达式在集合操作中的应用
  • 大语言模型下的多智能体协作机制研究综述
  • kettle工具使用从入门到精通(二)-------Java代码案例
  • 八字排盘宝 2025.1.8 | 多模式排盘工具,精准解析八字信息,轻量易用
  • 【机器学习chp11】聚类(K均值+高斯混合模型+层次聚类+基于密度的聚类DBSCAN+基于图的聚类+聚类的性能评价指标)
  • Unity之如何实现哔哩哔哩直播弹幕游戏
  • Python脚本,音频格式转换 和 视频格式转换
  • Pytorch 第八回:卷积神经网络——GoogleNet模型
  • SpringBoot 配置视图控制器
  • Android Activity的启动器ActivityStarter入口
  • 使用 Java 在后端 为 PDF 添加水印