手把手教你学C++(十六)--C++ 处理日期和时间

目录

1. C 风格日期和时间库

时间类型

常用函数

示例

2. C++11 日期和时间库 ()

时间点 (chrono::time_point)

时间间隔 (chrono::duration)

日期时间格式化

3. 第三方库

Boost.Date_Time

总结


 

在 C++ 中处理日期和时间是一个常见的需求,尤其是在涉及到需要记录事件发生时间的应用程序中。C++ 标准库并没有提供专门的日期类型,但提供了多种方式来处理日期和时间数据。以下是 C++ 中处理日期和时间的一些主要方法:

1. C 风格日期和时间库

C++ 继承了 C 语言中用于日期和时间操作的库,主要位于 <ctime> 头文件中。这个库提供了基本的时间表示和操作。

时间类型

  • clock_t:用于表示从程序启动以来经过的 CPU 时间。
  • time_t:表示从 Unix 纪元(1970 年 1 月 1 日 00:00:00 UTC)以来的秒数。
  • tm 结构:表示本地或格林威治标准时间的结构。
 

cpp

深色版本

struct tm {
    int tm_sec;     // 秒,范围 [0, 59]
    int tm_min;     // 分,范围 [0, 59]
    int tm_hour;    // 小时,范围 [0, 23]
    int tm_mday;    // 月份中的日期,范围 [1, 31]
    int tm_mon;     // 月份,范围 [0, 11],0 表示 1 月
    int tm_year;    // 自 1900 年以来的年数
    int tm_wday;    // 星期几,范围 [0, 6],0 表示周日
    int tm_yday;    // 一年中的日期,范围 [0, 365],1 月 1 日为 0
    int tm_isdst;   // 夏令时标志
};

常用函数

  • time(NULL):获取当前时间,返回 time_t 类型的值。
  • localtime(&time_t):将 time_t 类型的时间转换为本地时间 tm 结构。
  • gmtime(&time_t):将 time_t 类型的时间转换为 UTC 时间 tm 结构。
  • asctime(&tm):将 tm 结构转换为字符串形式。
  • strftime(char*, size_t, const char*, const tm*):格式化时间。

示例

 

cpp

深色版本

#include <iostream>
#include <ctime>
using namespace std;

int main() {
    // 获取当前时间
    time_t now = time(NULL);

    // 转换为本地时间
    tm *localTime = localtime(&now);

    // 格式化输出
    char buffer[20];
    strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", localTime);

    cout << "Local Time: " << buffer << endl;

    return 0;
}

2. C++11 日期和时间库 (<chrono>)

从 C++11 开始,标准库引入了 <chrono> 头文件,提供了更高级的日期和时间处理能力。

时间点 (chrono::time_point)

表示一个时间点,可以使用 chrono::system_clock 来获取当前时间。

 

cpp

深色版本

#include <iostream>
#include <chrono>
using namespace std;
using namespace std::chrono;

int main() {
    auto now = system_clock::now();
    cout << "Current Time Point: " << now.time_since_epoch().count() << endl;
    return 0;
}

时间间隔 (chrono::duration)

表示时间间隔,可以用于计算时间差。

 

cpp

深色版本

int main() {
    auto start = system_clock::now();
    this_thread::sleep_for(seconds(2)); // 模拟耗时操作
    auto end = system_clock::now();
    auto duration = duration_cast<milliseconds>(end - start);
    cout << "Duration: " << duration.count() << " ms" << endl;
    return 0;
}

日期时间格式化

使用 chrono 库进行日期时间格式化相对复杂,通常需要配合字符串流。

 

cpp

深色版本

#include <iostream>
#include <chrono>
#include <iomanip>
using namespace std;
using namespace std::chrono;

int main() {
    auto now = system_clock::now();
    auto in_time_t = system_clock::to_time_t(now);

    // 使用字符串流进行格式化
    ostringstream os;
    os << put_time(localtime(&in_time_t), "%Y-%m-%d %X");
    string str = os.str();

    cout << "Formatted Date and Time: " << str << endl;
    return 0;
}

3. 第三方库

对于更复杂的日期和时间处理,如时区转换、闰年计算等,可以考虑使用第三方库,如 Boost.Date_Time 或者 POCO 库。

Boost.Date_Time

Boost 库提供了丰富的日期和时间处理功能,包括时区处理、日期算术等。

 

cpp

深色版本

#include <iostream>
#include <boost/date_time.hpp>
#include <boost/date_time/gregorian/gregorian.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

using namespace boost::gregorian;
using namespace boost::posix_time;

int main() {
    date today(date_clock::local_day());
    ptime now = second_clock::local_time();
    cout << "Today's Date: " << today << endl;
    cout << "Current Time: " << now.time_of_day() << endl;
    return 0;
}

总结

C++ 中处理日期和时间的方式多种多样,从基本的 C 风格库到现代化的 <chrono> 库,再到第三方库,可以根据具体需求选择合适的工具。了解这些工具及其使用方法,可以帮助你更好地管理程序中的日期和时间数据。随着 C++ 标准的不断发展,未来的版本可能会提供更多便利的日期和时间处理功能。

 

习IEC 104协议和编程实现九号遥控功能是一项复杂的任务。本文将以300字的篇幅简要概述该过程。 首先,IEC 104协议是电力自动化系统中常用的通信协议之一,用于远程监控和控制通信。要习IEC 104协议,首先需要了解其基本原理和通信过程。可以通过阅读相关技术文档、书籍和在线程来深入了解IEC 104协议的细节。 接下来,习IEC 104协议的编程实现需要有一定的编程基础。主要编程语言可以选择C、C++或者其他常用的编程语言。编程实现九号遥控功能需要掌握IEC 104协议的编码和解码过程,了解相应的数据结构和流程控制。 在编程实现九号遥控功能时,首先需要建立与远程终端设备的连接。可以利用TCP/IP协议进行通信,建立socket连接。在连接建立后,必须正确配置IEC 104协议的站地址、传输参数等信息。 然后,需要编写代码实现IEC 104协议的编码和解码过程。首先,将要发送的遥控命令封装成IEC 104规定的格式,即APCI(Application Protocol Control Information)+ASDU(Application Service Data Unit)+ASDU信息组。然后,根据协议规定的解码方式,对接收到的遥控命令进行解码。 最后,根据九号遥控功能的具体需求,编写代码处理相应的逻辑。例如,判断遥控命令的类型,执行相应的操作,并及时响应给远程终端设备。 总结而言,习IEC 104协议和编程实现九号遥控功能是一项需要专业知识和编程技能的任务。需要深入习和实践才能掌握。希望以上简要概述可以为您提供一些指导。如需深入了解,请参考相关专业文献和指导资料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值