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;
}
相关推荐
在下小孙21 分钟前
初始C#.
开发语言·c#
freexyn27 分钟前
Matlab自学笔记四十五:日期时间型和字符、字符串以及double型的相互转换方法
开发语言·笔记·matlab
kiiila1 小时前
【Qt 常用控件】按钮类(QPushButton、QRadioButton、QCheckBox)
开发语言·qt
江木1232 小时前
Python Numba多流和共享内存CUDA优化技术学习记录
开发语言·python·学习
千里马学框架2 小时前
安卓java端service如何在native进程进行访问-跨进程通讯高端知识
android·java·开发语言·安卓framework开发·车机·跨进程·安卓窗口系统
NULL->NEXT2 小时前
Java(面向对象进阶——接口)
android·java·开发语言
技术的探险家3 小时前
R语言的文件操作
开发语言·后端·golang
珹洺3 小时前
音乐播放器实现:前端HTML,CSS,JavaScript综合大项目
开发语言·前端·javascript·css·gitee·bootstrap·html
多多*3 小时前
Sync底层字节码 monitorEnter和monitorExit 对象监视器
java·开发语言·windows·python·spring
爱上语文3 小时前
MyBatis实现数据库的CRUD
java·开发语言·数据库·mybatis