「C++系列」日期/时间
·零落· 2024-09-04 08:35:05 阅读 56
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:人工智能教程
文章目录
一、日期/时间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语言风格的<code><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++系列」引用
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。