「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_clockstd::chrono::steady_clockstd::chrono::high_resolution_clock等时钟类型。std::chrono::time_point:表示一个时间点。std::chrono::duration:表示两个时间点之间的时间间隔。std::chrono::secondsstd::chrono::milliseconds等持续时间类型。std::chrono::format(C++20中未直接提供,但可以通过第三方库如datefmt库实现格式化)。

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++系列」引用



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。