前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:人工智能教程
文章目录
- 一、日期/时间
- 1. C++标准库(C++20之前)
- `<ctime>`库中的关键组件:
- 2. C++20 `<chrono>`库
- `<chrono>`库中的关键组件:
- 3. 第三方库
- 示例代码(使用`<ctime>`)
- 二、日期/时间的相关函数
- 三、当前日期/时间
- 1. 使用C++标准库(C++20之前)
- 2. 使用C++20 `<chrono>` 和 `<format>`(如果可用)
- 3. 使用第三方库
- 使用{fmt}库和`<chrono>`格式化时间的示例(假设你有{fmt}库的支持)
- 四、格式化日期/时间
- 1. 使用C++标准库(C++20之前)
- 2. 使用C++20 `<chrono>` 和 `<format>`(如果可用)
- 3. 使用第三方库
- 五、相关链接
一、日期/时间
在C++中处理日期和时间,有几种不同的方式,具体取决于你使用的C++标准版本(如C++98, C++11, C++17等)以及你是否愿意使用第三方库。
1. C++标准库(C++20之前)
在C++20之前,C++标准库本身并没有直接提供丰富的日期和时间处理功能。但是,你可以使用C语言风格的<ctime>
库,它提供了一些基本的日期和时间处理功能。
<ctime>
库中的关键组件:
time_t
:表示时间的算术类型,通常是从某个固定时间点(如1970年1月1日)以来的秒数。tm
结构体:包含了一个分解的时间,包括年、月、日、小时、分钟、秒等。clock()
函数:返回程序启动到函数调用时的处理器时间。time()
函数:获取当前时间(自1970年1月1日以来的秒数)。localtime()
和gmtime()
函数:将time_t
值转换为本地时间和UTC时间(tm
结构体)。difftime()
函数:计算两个时间点之间的差异(以秒为单位)。strftime()
函数:将tm
结构体中的时间格式化为字符串。
2. C++20 <chrono>
库
C++20引入了更强大的日期和时间库<chrono>
,它提供了更精确的时间点(time_point
)、持续时间(duration
)和时钟(clock
)的表示。
<chrono>
库中的关键组件:
std::chrono::system_clock
、std::chrono::steady_clock
、std::chrono::high_resolution_clock
等时钟类型。std::chrono::time_point
:表示一个时间点。std::chrono::duration
:表示两个时间点之间的时间间隔。std::chrono::seconds
、std::chrono::milliseconds
等持续时间类型。std::chrono::format
(C++20中未直接提供,但可以通过第三方库如date
或fmt
库实现格式化)。
3. 第三方库
由于C++标准库在日期和时间处理方面的限制,许多开发者选择使用第三方库,如:
- Boost.Date_Time:Boost库的一部分,提供了丰富的日期和时间处理功能。
- Howard Hinnant/date:一个轻量级的日期库,后来被纳入C++20标准库(作为
<chrono>
的一部分的灵感来源)。 - fmtlib:一个现代C++格式化库,也支持日期和时间的格式化。
示例代码(使用<ctime>
)
#include <iostream>
#include <ctime>int main() {// 获取当前时间std::time_t now = std::time(nullptr);// 转换为本地时间std::tm* local = std::localtime(&now);// 格式化时间char buffer[80];std::strftime(buffer, sizeof(buffer), "%Y-%m-%d %X", local);std::cout << "Current time: " << buffer << std::endl;return 0;
}
二、日期/时间的相关函数
序号 | 函数 & 描述 |
---|---|
1 | time_t time(time_t *time) ,该函数返回系统的当前日历时间,自 1970 年 1 月 1 日以来经过的秒数。如果系统没有时间,则返回 -1。 |
2 | char *ctime(const time_t *time) ,该返回一个表示当地时间的字符串指针,字符串形式 day month year hours:minutes:seconds year\n\0。 |
3 | struct tm *localtime(const time_t *time) ,该函数返回一个指向表示本地时间的 tm 结构的指针。 |
4 | `clock_t clock(void);该函数返回程序执行起(一般为程序的开头),处理器时钟所使用的时间。如果时间不可用,则返回 -1。 |
5 | char * asctime ( const struct tm * time ) ,该函数返回一个指向字符串的指针,字符串包含了 time 所指向结构中存储的信息,返回形式为:day month date hours:minutes:seconds year\n\0。 |
6 | struct tm *gmtime(const time_t *time) ,该函数返回一个指向 time 的指针,time 为 tm 结构,用协调世界时(UTC)也被称为格林尼治标准时间(GMT)表示。 |
7 | time_t mktime(struct tm *time) ,该函数返回日历时间,相当于 time 所指向结构中存储的时间。 |
8 | double difftime ( time_t time2, time_t time1 ) ,该函数返回 time1 和 time2 之间相差的秒数。 |
9 | size_t strftime() ,该函数可用于格式化日期和时间为指定的格式。 |
三、当前日期/时间
在C++中,获取当前日期和时间可以通过多种方式实现,具体取决于你使用的C++标准版本以及你是否愿意使用第三方库。
1. 使用C++标准库(C++20之前)
在C++20之前,标准库本身并没有直接提供丰富的日期和时间处理功能,但你可以使用C语言风格的<ctime>
库。
#include <iostream>
#include <ctime>int main() {// 获取当前时间std::time_t now = std::time(nullptr);// 转换为本地时间std::tm* local = std::localtime(&now);// 格式化时间(注意:%Y-%m-%d %H:%M:%S 是年-月-日 时:分:秒的格式)char buffer[80];std::strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local);std::cout << "Current date and time: " << buffer << std::endl;return 0;
}
2. 使用C++20 <chrono>
和 <format>
(如果可用)
C++20引入了<chrono>
库用于处理时间,并且<format>
库(虽然作为技术规范TS实现,并非所有编译器都直接支持)可以用于格式化时间。但是,请注意,<format>
库在C++20标准中并不是核心部分,可能需要额外的库支持(如{fmt}
库)。
然而,C++20标准库本身并没有直接提供将std::chrono::system_clock::time_point
格式化为可读日期字符串的功能。你需要自己实现或使用第三方库。
但是,你可以使用<chrono>
来获取当前时间点,并使用其他方式(如<ctime>
或第三方库)来格式化它。
3. 使用第三方库
- Boost.Date_Time:Boost库的一部分,提供了丰富的日期和时间处理功能,包括格式化。
- Howard Hinnant/date(现在是C++20
<chrono>
的灵感来源):虽然它本身是一个独立的库,但它的许多概念都已经被C++20采纳。 - {fmt}:一个现代C++格式化库,它支持自定义类型(包括时间类型)的格式化。你可以结合使用
<chrono>
和{fmt}
来格式化时间。
使用{fmt}库和<chrono>
格式化时间的示例(假设你有{fmt}库的支持)
#include <fmt/chrono.h>
#include <iostream>
#include <chrono>int main() {using namespace std::chrono;// 获取当前时间点auto now = system_clock::now();// 使用{fmt}库格式化时间std::string formatted_time = fmt::format("{:%Y-%m-%d %H:%M:%S}", now);std::cout << "Current date and time: " << formatted_time << std::endl;return 0;
}
请注意,为了使用{fmt}
库,你可能需要安装它并正确配置你的项目以包含它。
四、格式化日期/时间
在C++中,格式化日期/时间可以通过多种方式实现,具体取决于你使用的C++标准版本以及你是否愿意使用第三方库。以下是几种常见的方法:
1. 使用C++标准库(C++20之前)
在C++20之前,标准库中没有直接支持日期/时间格式化的高级功能。但是,你可以使用<ctime>
库结合strftime
函数来格式化时间。
#include <iostream>
#include <ctime>int main() {// 获取当前时间std::time_t now = std::time(nullptr);// 转换为本地时间std::tm* local = std::localtime(&now);// 格式化时间char buffer[80];std::strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local);std::cout << "Formatted date and time: " << buffer << std::endl;return 0;
}
2. 使用C++20 <chrono>
和 <format>
(如果可用)
C++20引入了<chrono>
库用于时间处理,但<format>
库(作为技术规范TS实现)并非所有编译器都直接支持。不过,你可以使用第三方库如{fmt}
,它提供了类似<format>
的功能,并且可以与<chrono>
一起使用来格式化时间。
请注意,C++20标准本身并没有直接提供将std::chrono::system_clock::time_point
转换为格式化字符串的函数,但你可以通过转换为std::time_t
然后使用std::localtime
(或std::gmtime
)和std::strftime
,或者使用第三方库来实现。
然而,如果你使用的是支持<format>
或类似功能的编译器/库,你可以这样做:
#include <fmt/core.h> // 假设你使用的是{fmt}库
#include <fmt/chrono.h> // {fmt}库中对chrono的支持(如果可用)
#include <iostream>
#include <chrono>
#include <ctime>int main() {using namespace std::chrono;// 注意:{fmt}库可能不直接支持system_clock::time_point的格式化// 但你可以转换为time_t,然后使用strftime,或者等待{fmt}库的更新// 获取当前时间点auto now = system_clock::now();// 转换为time_t(如果需要与strftime一起使用)auto now_c = system_clock::to_time_t(now);// 使用{fmt}库格式化(这里我们仍然使用strftime作为示例,因为{fmt}直接支持可能有限)std::tm* local = std::localtime(&now_c);char buffer[80];std::strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local);std::cout << "Formatted date and time (using strftime): " << buffer << std::endl;// 或者,如果{fmt}库未来版本支持,你可以直接使用fmt::format来格式化chrono::time_point// 例如:std::string formatted = fmt::format("{:%Y-%m-%d %H:%M:%S}", now); // 假设的语法return 0;
}
但是,请注意上面的{fmt}::format
示例语法是假设的,因为{fmt}
库(截至我最后的知识更新)并不直接支持std::chrono::system_clock::time_point
的格式化。你可能需要先将time_point
转换为std::time_t
,然后如上所示使用std::strftime
,或者等待{fmt}
库的更新以提供对chrono
的直接支持。
3. 使用第三方库
除了{fmt}
之外,还有其他第三方库可以用于格式化日期/时间,如Boost.Date_Time或Howard Hinnant的date
库(后者现在是C++20 <chrono>
的灵感来源之一)。这些库通常提供了更强大、更灵活的日期/时间处理功能,包括格式化。
五、相关链接
- Visual Studio Code下载地址
- Sublime Text下载地址
- 「C++系列」C++简介、应用领域
- 「C++系列」C++ 基本语法
- 「C++系列」C++ 数据类型
- 「C++系列」C++ 变量类型
- 「C++系列」C++ 变量作用域
- 「C++系列」C++ 常量知识点-细致讲解
- 「C++系列」C++ 修饰符类型
- 「C++系列」一篇文章说透【存储类】
- 「C++系列」一篇文章讲透【运算符】
- 「C++系列」循环
- 「C++系列」判断
- 「C++系列」函数/内置函数
- 「C++系列」数字/随机数
- 「C++系列」数组
- 「C++系列」字符串
- 「C++系列」指针
- 「C++系列」引用