c++ chrono 操作 以及c语言的时间操作

std::chrono::time_point 是c++11引入的一个模板类,用于表示特定的时间点。它通常和std::chrono::duration结合使用,支持加减操作和时间点比较操作。

以下是std::chrono::time_point的常见操作:

1.获取当前时间

cpp 复制代码
#include <chrono>
#include <iostream>


int main()
{
    auto now = std::chrono::high_resolution_clock::now();
    std::cout << "Time captured.\n";
    return 0;
}

2.加减操作

time_point 和duration 可以直接加减操作,用于计算新的时间点或计算时间差

加时间

cpp 复制代码
auto now = std::chrono::high_resolution_clock::now();
auto future_time = now + stf::chrono::seconds(10);// 给当前时间加10秒

减时间

cpp 复制代码
auto now = std::chrono::high_resolution_clock::now();
auto past_now = now - std::chrono::minutes(5);  // 当前时间减5分钟

3.计算时间差

time_point 可以相减,返回duration 类型,用于计算两个时间点的时间差

cpp 复制代码
#include <iostream>
#include <chrono>


int main()
{

    auto start = std::chrono::high_resolution_clock::now();
    std::this_thread::sleep_for(std::chrono::seconds(2));
    auto end = std::chrono::high_resolution_clock::now();
    
    auto elapsed = end - start;
    std::cout<<"Elapsed time: "
             << std::chrono::duration_cast<std::chrono::milliseconds>(elapsed).count()
             << " ms\n";
    return 0;
}

4.比较操作

time_point 支持比较操作符<,<=,>,>=,==,!=

cpp 复制代码
auto now = std::chrono::high_resolution_clock::now();
auto future_time = now + std::chrono::seconds(5);
if (future_time > now)
{
    std::cout << "Future time is later than now.\n";
}

5.强制类型转换

时间点的默认单位取决于其时钟类型 如(std::chrono::system_clock 或 std::chrono::high_resolution_clock).可以通过std::chrono::duration_cast将时间点转化为特定的时间单位

cpp 复制代码
auto now = std::chrono::high_resolution_clock::now();
auto duration_since_epoch = now.time_since_epoch();
auto millis = std::chrono::duration_cast<std::chrono::milliseconds>(duration_since_epoch);
std::cout <<"Milliseconds since epoch: "<< millis.count() <<'\n';

6.获取时间点的秒、毫秒、微秒

通过time_since_epoch 和std::chrono::duration_cast

cpp 复制代码
auto now = std::chrono::system_clock::now();
auto time_sin_epoch = now.time_since_epoch();


auto seconds = std::chrono::duration_cast<std::chrono::seconds>(time_since_epoch);
auto milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(time_since_epoch);
auto microseconds = std::chrono::duratioin_cast<std::chrono::microseconds>(time_since_epoch);

std::cout << "Seconds since epoch: "<< seconds.count()<<'\n';
std::cout << "Milliseconds since epoch: "<< milliseconds.count()<<'\n';
std::cout << "Microseconds since epoch: "<< microseconds.count()<<'\n';

7.初始化time_point

默认情况下,time_point 会被初始化为时间纪元(epoch),即0

cpp 复制代码
std::chrono::time_point<std::chrono::system_clock> tp; // 时间点初始化为 epoch

可以通过指定duration初始化

cpp 复制代码
auto tp = std::chrono::system_clock::time_point(std::chrono::seconds(10)); // 从 epoch 开始 10 秒

8.自定义时钟

可以结合自定义的时钟和time_point使用。例如,以下代码定义一个以小时为单位的自定义时钟

cpp 复制代码
#include <chrono>
#include <iostream>

struct CustomClock {
    using duration = std::chrono::hours;
    using rep = duration::rep;
    using period = duration::period;
    using time_point = std::chrono::time_point<CustomClock>;

    static time_point now() noexcept {
        return time_point(duration(42)); // 固定时间点,假设现在是42小时
    }
};

int main() {
    auto custom_time = CustomClock::now();
    std::cout << "Custom clock time: "
              << custom_time.time_since_epoch().count() << " hours\n";
    return 0;
}

c语言获取当前时间(包括年月日) 通过time.h 头文件中的time()和localtime() 函数实现。

cpp 复制代码
#include <stdio.h>
#include <time.h>
#include <sys/time.h>

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

    // 如果获取时间失败
    if (t == -1) {
        perror("time");
        return 1;
    }

    // 将时间戳转换为本地时间
    struct tm *local_time = localtime(&t);

    // 获取年、月、日、时、分、秒
    int year = local_time->tm_year + 1900;  // tm_year 是从 1900 年开始的
    int month = local_time->tm_mon + 1;     // tm_mon 是从 0 开始的,0 表示 1 月
    int day = local_time->tm_mday;          // tm_mday 是从 1 开始的
    int hour = local_time->tm_hour;
    int minute = local_time->tm_min;
    int second = local_time->tm_sec;

    // 获取当前时间的微秒数
    struct timeval tv;
    if (gettimeofday(&tv, NULL) != 0) {
        perror("gettimeofday");
        return 1;
    }
    int microsecond = tv.tv_usec;  // 微秒

    // 打印年月日时分秒和微秒
    printf("Current date and time: %d-%02d-%02d %02d:%02d:%02d.%06d\n",
           year, month, day, hour, minute, second, microsecond);

    return 0;
}

C++ 获取年月日时分秒 和微秒

cpp 复制代码
#include <iostream>
#include <chrono>
#include <iomanip>
#include <ctime>

int main() {
    // 获取当前时间
    auto now = std::chrono::system_clock::now();

    // 获取当前时间点的秒部分
    auto now_seconds = std::chrono::time_point_cast<std::chrono::seconds>(now);
    auto duration = now - now_seconds;  // 获取微秒部分
    auto microseconds = std::chrono::duration_cast<std::chrono::microseconds>(duration).count();

    // 将当前时间转换为 system_clock 时间戳
    std::time_t now_time_t = std::chrono::system_clock::to_time_t(now_seconds);

    // 转换为本地时间
    std::tm local_time = *std::localtime(&now_time_t);

    // 打印年月日时分秒和微秒
    std::cout << "Current date and time: "
              << std::put_time(&local_time, "%Y-%m-%d %H:%M:%S")
              << "." << std::setw(6) << std::setfill('0') << microseconds
              << std::endl;

    return 0;
}
相关推荐
jerryinwuhan5 小时前
基于各城市站点流量的复合功能比较
开发语言·php
迈巴赫车主6 小时前
Java基础:list、set、map一遍过
java·开发语言
智者知已应修善业6 小时前
【51单片机89C51及74LS273、74LS244组成】2022-5-28
c++·经验分享·笔记·算法·51单片机
南 阳7 小时前
Python从入门到精通day66
开发语言·python
十八旬8 小时前
快速安装ClaudeCode完整指南
开发语言·windows·python·claude
前进的李工9 小时前
EXPLAIN输出格式全解析:JSON、TREE与可视化
开发语言·数据库·mysql·性能优化·explain
Byron Loong9 小时前
【c++】为什么有了dll和.h,还需要包含lib
java·开发语言·c++
独隅9 小时前
CodeX + Visual Studio Code 联动的全面指南
开发语言·php
坚果派·白晓明9 小时前
【鸿蒙PC三方库移植适配框架解读系列】第一篇:Lycium C/C++ 三方库适配 — 概述与环境配置
c语言·开发语言·c++·harmonyos·开源鸿蒙·三方库·c/c++三方库
爱吃小白兔的猫10 小时前
LPA算法详解:一种近线性时间的图社区发现方法
开发语言·php