【C++风云录】强大的功能集:探索丰富的日期与时间处理库

简化日期与时间处理:选择适合你的项目的库

引言

在软件开发中,处理日期和时间是一个普遍的需求。然而,由于日期和时间的复杂性,以及不同的文化、地域和时区差异,处理日期和时间可能会变得复杂和困难。为了解决这个问题,有几种日期与时间处理库可供选择。本文将介绍一些常见的日期与时间处理库,包括ChronoLite、Date、HowardHinnant.Date、ICU、Boost.DateTime和C++20日期和时间库,帮助你选择适合你的项目的库。

欢迎订阅专栏:C++风云录

文章目录

  • 简化日期与时间处理:选择适合你的项目的库
    • 引言
    • 1. ChronoLite
      • 1.1 概述
      • 1.2 日期操作
        • 1.2.1 构建日期对象
        • 1.2.2 日期的比较和计算
      • 1.3 时间操作
        • 1.3.1 构建时间对象
        • 1.3.2 时间的比较和计算
    • 2. Date
      • 2.1 概述
      • 2.2 日期操作
        • 2.2.1 构建日期对象
        • 2.2.2 日期的比较和计算
      • 2.3 时间操作
        • 2.3.1 构建时间对象
        • 2.3.2 时间的比较和计算
    • 3. HowardHinnant.Date
      • 3.1 概述
      • 3.2 日期操作
        • 3.2.1 构建日期对象
        • 3.2.2 日期的比较和计算
      • 3.3 时间操作
        • 3.3.1 构建时间对象
        • 3.3.2 时间的比较和计算
    • 4. ICU
      • 4.1 概述
      • 4.2 日期格式化
      • 4.3 时区转换
    • 5. Boost.DateTime
      • 5.1 概述
      • 5.2 日期操作
        • 5.2.1 构建日期对象
        • 5.2.2 日期的比较和计算
      • 5.3 时间操作
        • 5.3.1 构建时间对象
        • 5.3.2 时间的比较和计算
    • 6. C++20 日期和时间库
      • 6.1 概述
      • 6.2 日期操作
        • 6.2.1 构建日期对象
        • 6.2.2 日期的比较和计算
      • 6.3 时间操作
        • 6.3.1 构建时间对象
        • 6.3.2 时间的比较和计算
    • 总结

1. ChronoLite

1.1 概述

ChronoLite是C++标准库中std::chrono的一个精简版本,提供了处理日期和时间的功能。

1.2 日期操作

1.2.1 构建日期对象

你可以使用chrono::year_month_day类型来构建日期对象。比如,可以使用chrono::year{2022}/1/1来构建2022年1月1日的日期对象。

#include <chrono>int main() {using namespace std::chrono;year_month_day date = year{2022}/1/1;return 0;
}
1.2.2 日期的比较和计算

可以使用日期对象的比较运算符(例如==<>等)来比较日期的大小。还可以使用chrono::year_month_day::operator+=(chrono::months{1})来对日期进行加法运算。

#include <iostream>
#include <chrono>int main() {using namespace std::chrono;year_month_day date1 = year{2022}/1/1;year_month_day date2 = year{2022}/2/1;if (date1 < date2) {std::cout << "date1 is earlier than date2" << std::endl;}date1 += months{1};std::cout << "New date1: " << date1 << std::endl;return 0;
}

输出结果:

date1 is earlier than date2
New date1: 2022-02-01

1.3 时间操作

1.3.1 构建时间对象

你可以使用chrono::hourschrono::minuteschrono::seconds等类型来构建时间对象。比如,chrono::hours{12}表示12小时。

#include <iostream>
#include <chrono>int main() {using namespace std::chrono;hours h = hours{12};minutes m = minutes{30};seconds s = seconds{45};std::cout << "Time: " << h << ":" << m << ":" << s << std::endl;return 0;
}

输出结果:

Time: 12:30:45
1.3.2 时间的比较和计算

可以使用时间对象的比较运算符(例如==<>等)来比较时间的大小。还可以使用chrono::minutes::operator+=(chrono::hours{1})来对时间进行加法运算。

#include <iostream>
#include <chrono>int main() {using namespace std::chrono;hours h1 = hours{12};minutes m1 = minutes{30};hours h2 = hours{13};minutes m2 = minutes{30};if (h1 < h2) {std::cout << "h1 is earlier than h2" << std::endl;}m1 += hours{1};std::cout << "New m1: " << m1 << std::endl;return 0;
}

输出结果:

h1 is earlier than h2
New m1: 01:30

以上是关于ChronoLite的介绍和示例代码。你可以根据需要使用这些代码来处理日期和时间。

好的,接下来我们继续填充关于Date的内容。

2. Date

2.1 概述

Date是一个现代化的日期和时间库,提供了简单、灵活和易于使用的接口。

2.2 日期操作

2.2.1 构建日期对象

你可以使用date::year_month_day类型来构建日期对象。比如,可以使用date::year{2022}/1/1来构建2022年1月1日的日期对象。

#include <iostream>
#include <date/date.h>int main() {using namespace date;year_month_day date = year{2022}/1/1;std::cout << "Date: " << date << std::endl;return 0;
}
2.2.2 日期的比较和计算

可以使用日期对象的比较运算符(例如==<>等)来比较日期的大小。还可以使用date::year_month_day::operator+=(date::months{1})来对日期进行加法运算。

#include <iostream>
#include <date/date.h>int main() {using namespace date;year_month_day date1 = year{2022}/1/1;year_month_day date2 = year{2022}/2/1;if (date1 < date2) {std::cout << "date1 is earlier than date2" << std::endl;}date1 += months{1};std::cout << "New date1: " << date1 << std::endl;return 0;
}

输出结果:

date1 is earlier than date2
New date1: 2022-02-01

2.3 时间操作

2.3.1 构建时间对象

你可以使用date::hh_mm_ss类型来构建时间对象。比如,date::hh_mm_ss{12, 0, 0}表示12:00:00。

#include <iostream>
#include <date/date.h>int main() {using namespace date::literals;date::hh_mm_ss time = 12h + 30min + 45s;std::cout << "Time: " << time << std::endl;return 0;
}

输出结果:

Time: 12:30:45
2.3.2 时间的比较和计算

可以使用时间对象的比较运算符(例如==<>等)来比较时间的大小。还可以使用date::hh_mm_ss::operator+=(date::hours{1})来对时间进行加法运算。

#include <iostream>
#include <date/date.h>int main() {using namespace date::literals;date::hh_mm_ss time1 = 12h + 30min;date::hh_mm_ss time2 = 13h + 30min;if (time1 < time2) {std::cout << "time1 is earlier than time2" << std::endl;}time1 += 1h;std::cout << "New time1: " << time1 << std::endl;return 0;
}

输出结果:

time1 is earlier than time2
New time1: 01:30:00

以上是关于Date的介绍和示例代码。你可以根据需要使用这些代码来处理日期和时间。

好的,接下来我们继续填充关于HowardHinnant.Date的内容。

3. HowardHinnant.Date

3.1 概述

HowardHinnant.Date是一个优秀、跨平台的日期和时间库,它提供了高效且灵活的日期和时间操作。

3.2 日期操作

3.2.1 构建日期对象

你可以使用date::year_month_day类型来构建日期对象。比如,可以使用date::year{2022}/1/1来构建2022年1月1日的日期对象。

#include <iostream>
#include "date/date.h"int main() {using namespace date;year_month_day date = year{2022}/1/1;std::cout << "Date: " << date << std::endl;return 0;
}
3.2.2 日期的比较和计算

可以使用日期对象的比较运算符(例如==<>等)来比较日期的大小。还可以使用date::year_month_day::operator+=(date::months{1})来对日期进行加法运算。

#include <iostream>
#include "date/date.h"int main() {using namespace date;year_month_day date1 = year{2022}/1/1;year_month_day date2 = year{2022}/2/1;if (date1 < date2) {std::cout << "date1 is earlier than date2" << std::endl;}date1 += months{1};std::cout << "New date1: " << date1 << std::endl;return 0;
}

输出结果:

date1 is earlier than date2
New date1: 2022-02-01

3.3 时间操作

3.3.1 构建时间对象

你可以使用date::hh_mm_ss类型来构建时间对象。比如,date::hh_mm_ss{12, 0, 0}表示12:00:00。

#include <iostream>
#include "date/date.h"int main() {using namespace date;hh_mm_ss time = make_time(12h, 0min, 0s);std::cout << "Time: " << time << std::endl;return 0;
}

输出结果:

Time: 12:00:00
3.3.2 时间的比较和计算

可以使用时间对象的比较运算符(例如==<>等)来比较时间的大小。还可以使用date::hh_mm_ss::operator+=(date::hours{1})来对时间进行加法运算。

#include <iostream>
#include "date/date.h"int main() {using namespace date;hh_mm_ss time1 = make_time(12h, 30min);hh_mm_ss time2 = make_time(13h, 30min);if (time1 < time2) {std::cout << "time1 is earlier than time2" << std::endl;}time1 += hours{1};std::cout << "New time1: " << time1 << std::endl;return 0;
}

输出结果:

time1 is earlier than time2
New time1: 01:30:00

以上是关于HowardHinnant.Date的介绍和示例代码。你可以根据需要使用这些代码来处理日期和时间。

好的,接下来我们继续填充关于ICU的内容。

4. ICU

4.1 概述

ICU是一个国际化和本地化的C/C++库,提供了强大的日期和时间处理功能。

4.2 日期格式化

使用ICU,你可以将日期对象格式化为指定的字符串,或者将字符串解析为日期对象。

#include <iostream>
#include <unicode/datefmt.h>
#include <unicode/timezone.h>
#include <unicode/smpdtfmt.h>int main() {UErrorCode status = U_ZERO_ERROR;icu::SimpleDateFormat dateFormat("yyyy-MM-dd", status);icu::TimeZone* timeZone = icu::TimeZone::createTimeZone("Asia/Shanghai");icu::Calendar* calendar = icu::Calendar::createInstance(timeZone, status);calendar->set(2022, 0, 1);icu::UnicodeString formattedDate;dateFormat.format(calendar->getTime(status), formattedDate, status);std::cout << "Formatted date: " << formattedDate << std::endl;delete timeZone;delete calendar;return 0;
}

输出结果:

Formatted date: 2022-01-01

4.3 时区转换

ICU还提供了时区转换的功能,可以在不同的时区之间进行转换。

#include <iostream>
#include <unicode/datefmt.h>
#include <unicode/timezone.h>
#include <unicode/smpdtfmt.h>int main() {UErrorCode status = U_ZERO_ERROR;icu::SimpleDateFormat dateFormat("yyyy-MM-dd HH:mm:ss", status);icu::TimeZone* sourceTimeZone = icu::TimeZone::createTimeZone("America/New_York");icu::TimeZone* targetTimeZone = icu::TimeZone::createTimeZone("Asia/Shanghai");icu::Calendar* calendar = icu::Calendar::createInstance(sourceTimeZone, status);calendar->set(2022, 0, 1, 12, 0, 0);calendar->adoptTimeZone(targetTimeZone);icu::UnicodeString formattedDateTime;dateFormat.format(calendar->getTime(status), formattedDateTime, status);std::cout << "Formatted date and time in Shanghai timezone: " << formattedDateTime << std::endl;delete sourceTimeZone;delete targetTimeZone;delete calendar;return 0;
}

输出结果:

Formatted date and time in Shanghai timezone: 2022-01-02 01:00:00

以上是关于ICU的介绍和示例代码。ICU提供了强大的日期和时间处理功能,你可以根据需要使用这些代码来进行日期格式化和时区转换。

好的,接下来我们继续填充关于Boost.DateTime的内容。

5. Boost.DateTime

5.1 概述

Boost.DateTime是一个基于C++的日期和时间库,提供了丰富的日期和时间处理功能。

5.2 日期操作

5.2.1 构建日期对象

你可以使用boost::gregorian::date类型来构建日期对象。比如,可以使用boost::gregorian::date{2022, 1, 1}来构建2022年1月1日的日期对象。

#include <iostream>
#include <boost/date_time/gregorian/gregorian.hpp>int main() {using namespace boost::gregorian;date d{2022, 1, 1};std::cout << "Date: " << d << std::endl;return 0;
}
5.2.2 日期的比较和计算

可以使用日期对象的比较运算符(例如==<>等)来比较日期的大小。还可以使用boost::gregorian::date::operator+=(boost::gregorian::months{1})来对日期进行加法运算。

#include <iostream>
#include <boost/date_time/gregorian/gregorian.hpp>int main() {using namespace boost::gregorian;date d1{2022, 1, 1};date d2{2022, 2, 1};if (d1 < d2) {std::cout << "d1 is earlier than d2" << std::endl;}d1 += months{1};std::cout << "New d1: " << d1 << std::endl;return 0;
}

输出结果:

d1 is earlier than d2
New d1: 2022-Feb-01

5.3 时间操作

5.3.1 构建时间对象

你可以使用boost::posix_time::time_duration类型来构建时间对象。比如,boost::posix_time::time_duration{12, 0, 0}表示12:00:00。

#include <iostream>
#include <boost/date_time/posix_time/posix_time.hpp>int main() {using namespace boost::posix_time;time_duration td{12, 0, 0};std::cout << "Time: " << td << std::endl;return 0;
}

输出结果:

Time: 12:00:00
5.3.2 时间的比较和计算

可以使用时间对象的比较运算符(例如==<>等)来比较时间的大小。还可以使用boost::posix_time::time_duration::operator+=(boost::posix_time::hours{1})来对时间进行加法运算。

#include <iostream>
#include <boost/date_time/posix_time/posix_time.hpp>int main() {using namespace boost::posix_time;time_duration td1{12, 30, 0};time_duration td2{13, 30, 0};if (td1 < td2) {std::cout << "td1 is earlier than td2" << std::endl;}td1 += hours{1};std::cout << "New td1: " << td1 << std::endl;return 0;
}

输出结果:

td1 is earlier than td2
New td1: 01:30:00

以上是关于Boost.DateTime的介绍和示例代码。你可以根据需要使用这些代码来处理日期和时间。

好的,接下来我们继续填充关于C++20日期和时间库的内容。

6. C++20 日期和时间库

6.1 概述

C++20引入了一组新的日期和时间库,使得处理日期和时间变得更加简单和直观。

6.2 日期操作

6.2.1 构建日期对象

你可以使用std::chrono::year_month_day类型来构建日期对象。比如,可以使用std::chrono::year{2022}/1/1来构建2022年1月1日的日期对象。

#include <iostream>
#include <chrono>int main() {using namespace std::chrono;sys_days date = year{2022}/1/1;std::cout << "Date: " << date << std::endl;return 0;
}
6.2.2 日期的比较和计算

可以使用日期对象的比较运算符(例如==<>等)来比较日期的大小。还可以使用std::chrono::year_month_day::operator+=(std::chrono::months{1})来对日期进行加法运算。

#include <iostream>
#include <chrono>int main() {using namespace std::chrono;sys_days date1 = year{2022}/1/1;sys_days date2 = year{2022}/2/1;if (date1 < date2) {std::cout << "date1 is earlier than date2" << std::endl;}date1 += months{1};std::cout << "New date1: " << date1 << std::endl;return 0;
}

输出结果:

date1 is earlier than date2
New date1: 2022-02-01

6.3 时间操作

6.3.1 构建时间对象

你可以使用std::chrono::hoursstd::chrono::minutesstd::chrono::seconds等类型来构建时间对象。比如,std::chrono::hours{12}表示12小时。

#include <iostream>
#include <chrono>int main() {using namespace std::chrono;hours h = 12h;minutes m = 30min;seconds s = 45s;std::cout << "Time: " << h << ":" << m << ":" << s << std::endl;return 0;
}

输出结果:

Time: 12:30:45
6.3.2 时间的比较和计算

可以使用时间对象的比较运算符(例如==<>等)来比较时间的大小。还可以使用std::chrono::minutes::operator+=(std::chrono::hours{1})来对时间进行加法运算。

#include <iostream>
#include <chrono>int main() {using namespace std::chrono;hours h1 = 12h;minutes m1 = 30min;hours h2 = 13h;minutes m2 = 30min;if (h1 < h2) {std::cout << "h1 is earlier than h2" << std::endl;}m1 += hours{1};std::cout << "New m1: " << m1 << std::endl;return 0;
}

输出结果:

h1 is earlier than h2
New m1: 01:30

以上是关于C++20日期和时间库的介绍和示例代码。你可以根据需要使用这些代码来处理日期和时间。

总结

选择适合你的项目的日期与时间处理库是很重要的。每个库都有其特点和用途,可以根据个人喜好和项目需求进行选择。如果你需要一个轻量级的库,可以选择ChronoLite。如果你需要简单、灵活和易于使用的接口,可以选择Date。如果你追求高效性和灵活性,可以选择HowardHinnant.Date。如果你处理的是国际化和本地化的日期和时间,可以选择ICU。如果你需要丰富的日期和时间处理功能,可以选择Boost.DateTime。如果你使用C++20,那么可以直接使用C++20日期和时间库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/808345.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端小白的学习之路(Vue2 三)

提示&#xff1a;学习vue2的第三天&#xff0c;笔记记录&#xff1a;生命周期&#xff0c;组件(注册&#xff0c;传值) 目录 一、生命周期 二、组件 1.注册组件 1)全局注册 2)局部注册 2.组件传值 1&#xff09;父传子 2&#xff09;子传父 3&#xff09;兄弟传值 一…

智慧工地管理平台源码:提供专业落地的解决方案

目录 智慧工地平台功能简介 一、劳务实名制系统 二、智能塔吊可视系统 三、视频监控&#xff08;含安全行为识别&#xff09; 四、环境监测&#xff08;联动自动喷淋&#xff09; 五、起重机械管控&#xff08;含吊钩可视化&#xff09; 六、升降电梯智能管控 七、高支…

2万字长文:MySQL面试题及参考答案(持续更新)

MySQL作为最受欢迎的关系型数据库之一,无论是在面试中还是在实际工作中,对MySQL的深入理解和应用都是必不可少的。本文将为您提供一系列常见的MySQL面试题及其参考答案,帮助您在面试中脱颖而出,同时也为您的数据库实践提供指导。 目录 1. 什么是数据库事务?事务的ACID特…

鸿蒙让我赚到了第一笔桶金!年薪33.6W!

抢人&#xff01;抢人&#xff01;抢人&#xff01; 所谓抢滩鸿蒙&#xff0c;人才先行。鸿蒙系统火力全开后&#xff0c;抢人已成鸿蒙市场的主题词&#xff01; 智联招聘数据显示&#xff0c;春节后首周&#xff0c;鸿蒙相关职位数同比增长163%&#xff0c;是去年同期的2.6倍…

TypeScript学习笔记6-函数类型

函数类型 在 TypeScript 中&#xff0c;函数类型提示是一种方法&#xff0c;用于声明函数的类型信息。它允许你在编写函数时指定参数的类型和返回值的类型&#xff0c;从而增加了代码的可读性和可维护性&#xff0c;同时还能在编译时进行类型检查。 函数类型提示有两种方式&…

【C++算法】线性DP详解:数字三角形、最长上升子序列、最长公共子序列、最长公共子串、字符串编辑距离

文章目录 1&#xff09;数字三角形1&#xff1a;顺推2&#xff1a;逆推 2&#xff09;最长上升子序列1&#xff1a;线性DP做法2&#xff1a;二分优化 3&#xff09;最长公共子序列4&#xff09;最长公共子串5&#xff09;字符串编辑距离 1&#xff09;数字三角形 1&#xff1a…

vue跨页选中回显问题解决

如不理解可以评论&#xff0c;看到会 一 一 回复 ↓ 实现分页选中跨页还能选中其他数据回显 <el-pagination background style"background-color: #ffffff" size-change"handleSizeChange"current-change"handlePageChange" :current-page&q…

MySQL 通信协议 tcp c/s架构 jdbc java

简介 服务器启动后&#xff0c;会使用 TCP 监听一个本地端口&#xff0c;当客户端的连接请求到达时&#xff0c;就会执行三段握手以及 MySQL 的权限验证&#xff1b;验证成功后&#xff0c;客户端开始发送请求&#xff0c;服务器会以响应的报文格式返回数据&#xff1b;当客户…

股票高胜率的交易法则是什么?

股票交易中的高胜率交易法则并非一成不变&#xff0c;而是根据市场状况、个人投资风格和经验等多种因素综合而定的。以下是一些有助于提升交易胜率的法则和策略&#xff1a; 1.趋势跟踪法则&#xff1a;在股票交易中&#xff0c;趋势跟踪是一种有效的策略。通过观察大盘和个股…

快速排序:深入解析其原理、实现与性能特性

快速排序&#xff0c;以其名字所示&#xff0c;是一种追求速度的高效排序算法。作为分治法在排序问题上的典型应用&#xff0c;快速排序凭借其平均情况下近乎理想的O(n log n)时间复杂度和简洁的实现逻辑&#xff0c;在实际编程与数据处理中占据着重要地位。本篇博客将详细解析…

Week6-LeetCode

1600.王位继承顺序 (中等) 关键思路&#xff1a; 多叉树的前序遍历。 class ThroneInheritance(object):def __init__(self, kingName):""":type kingName: str"""self.king kingNameself.dead set() # 记录死亡人员self.edges defaultdict…

Hadoop安装部署-NameNode高可用版

Hadoop分布式文件系统支持NameNode的高可用性&#xff0c;本文主要描述NameNode多节点高可用性的安装部署。 如上所示&#xff0c;Hadoop分布式文件系统部署了NameNode的Master主节点以及NameNode的Slave副节点&#xff0c;当Master主节点发生故障变得不可用时&#xff0c;ZooK…

llama-factory SFT系列教程 (一),大模型 API 部署与使用

文章目录 背景简介难点 前置条件1. 大模型 api 部署下一步阅读 背景 本来今天没有计划学 llama-factory&#xff0c;逐步跟着github的文档走&#xff0c;发现这框架确实挺方便&#xff0c;逐渐掌握了一些。 最近想使用 SFT 微调大模型&#xff0c;llama-factory 是使用非常广泛…

python之文件操作与管理

1、文件操作 通过open&#xff08;&#xff09;操作&#xff0c;来创建文件对象&#xff0c;下面是open&#xff08;&#xff09;函数语法如下&#xff1a; open&#xff08;file,mode r,buffering -1 , encoding None ,errors None , newline None,closefd True,opener …

【综合分析类】校园霸凌

题目&#xff1a;近日&#xff0c;某地发生了一名初中生被3名初中生霸凌致S的事件&#xff0c;在社会上引起了广泛争议。有人呼吁&#xff0c;要完善未成年人保护法&#xff0c;进一步惩戒有关未成年的犯罪人员。对此你怎么看。 逐字稿&#xff1a;各位考官&#xff0c;考生思…

14. TypeScript类型保护(类型缩小、类型守卫)

类型保护是一种TypeScript技术&#xff0c;用于获取变量类型信息&#xff0c;通常使用在条件块语句中。 类型守卫是返回布尔值的常规函数&#xff0c;接受一个类型并告诉TypeScript是否可以缩小到更具体的类型。 TypeScript类型保护的方式 类型断言 类型断言是一种告诉编译器…

汇编基础-----常见命令基本使用

汇编基础-----常见命令基本使用 MOV&#xff1a;将数据从一个位置复制到另一个位置。 MOV destination, source例如&#xff1a; MOV RAX, RBX ; 将RBX寄存器中的值复制到RAX寄存器中ADD/SUB&#xff1a;将两个操作数相加或相减。 ADD destination, source SUB destinatio…

Python(3):条件语句+循环语句+逻辑运算符+符号优先级

文章目录 一、if语句1.if语句2.if 和 elif区别3.三元表达式 二、循环语句1.range函数和循环结束关键字2.while循环3.for循环 三、逻辑运算符1.and语句2.or语句3.not语句4.逻辑运算法的优先级 四、python运算符优先级和结合性一览表 一、if语句 1.if语句 1.if单分支语句 格式…

Python项目1 外星人入侵_外星人

在本章中&#xff0c;我们将在游戏《外星人入侵》中添加外星人。首先&#xff0c;我们在屏幕上边缘附近添加一个外星人&#xff0c;然后生成一群外星人。我们让这群外星人向两边和下面移 动&#xff0c;并删除被子弹击中的外星人。最后&#xff0c;我们将显示玩家拥有的飞船数量…

Python-configparser更新write保留注释

背景 python语言用来解析配置文件的模块是ConfigParser&#xff0c;python3中是configparser模块&#xff0c;在使用中经常用到write方法将配置项重新写入文件&#xff1a; config.ini文件&#xff1a; # 数据库配置 [database] # 主机 # IP host localhost # 端口 port 3…