Linux 时间操作详解

ops/2025/1/22 6:53:40/

Linux 时间操作详解

      • 1. Linux 中的时间概念
      • 2. time_t:表示时间的基本数据类型
        • 示例代码:获取当前时间
      • 3. 格式化时间:tm 结构体与 localtime() 函数
        • 示例代码:将 time_t 转换为本地时间
      • 4. 高精度时间操作:chrono 库
        • 示例代码:使用 chrono 库测量代码执行时间
      • 5. 获取更精确的时间:gettimeofday()
        • 示例代码:使用 gettimeofday() 获取当前时间
      • 6. 程序暂停:sleep() 与 usleep()
        • 示例代码:使用 sleep() 和 usleep() 暂停程序
      • 7. 时区操作:tzset() 与环境变量
        • 示例代码:设置时区并输出本地时间
      • 8. 总结

在 Linux 系统编程中,时间是一个非常重要的概念。无论是用于记录日志、时间戳、执行延时操作,还是处理复杂的时间计算,Linux 都提供了丰富的工具和库来帮助开发者高效地进行时间操作。本文将详细介绍 Linux 下常见的时间处理方法,并结合 C/C++ 示例代码进行说明。

1. Linux 中的时间概念

在 Linux 系统中,时间通常以自 1970 年 1 月 1 日 00:00:00 UTC(Unix 纪元)以来的秒数来表示。这个时间值通常称为 “Unix 时间”。在 C/C++ 中,我们可以使用不同的数据类型和函数来获取、操作和格式化时间。

2. time_t:表示时间的基本数据类型

在 C/C++ 中,time_t 是表示时间的基本数据类型,它通常是一个 long 类型的整数,存储的是从 Unix 纪元到当前时间的秒数。

示例代码:获取当前时间
#include <iostream>
#include <ctime>int main() {time_t now = time(0);  // 获取当前时间std::cout << "当前时间: " << now << " 秒,自 Unix 纪元以来。" << std::endl;return 0;
}

在这个例子中,time(0) 函数返回从 Unix 纪元以来的秒数,表示当前的 Unix 时间戳。

3. 格式化时间:tm 结构体与 localtime() 函数

tm 结构体用于存储分解后的时间信息,包含年份、月份、日期、小时、分钟、秒等。我们通常通过 localtime()gmtime() 函数将 time_t 转换为 tm 结构体来获取可读性更高的时间格式。

示例代码:将 time_t 转换为本地时间
#include <iostream>
#include <ctime>int main() {time_t rawtime;struct tm * timeinfo;time(&rawtime);  // 获取当前时间timeinfo = localtime(&rawtime);  // 转换为本地时间std::cout << "当前本地时间: " << asctime(timeinfo);  // 输出本地时间return 0;
}

4. 高精度时间操作:chrono 库

C++11 引入的 chrono 库提供了高精度时间操作工具,使得开发者能够更精确地处理时间间隔。它支持多种时钟类型和时间单位,能够在微秒、毫秒等级别上进行时间测量。

示例代码:使用 chrono 库测量代码执行时间
#include <iostream>
#include <chrono>using namespace std;int main() {auto start = chrono::high_resolution_clock::now();  // 获取开始时间// 模拟耗时操作for (int i = 0; i < 1000000; ++i);auto end = chrono::high_resolution_clock::now();  // 获取结束时间chrono::duration<double> diff = end - start;  // 计算耗时cout << "操作耗时: " << diff.count() << " 秒。" << endl;return 0;
}

在此示例中,chrono::high_resolution_clock 提供了系统上最精确的时钟,测量了循环执行的时间。

5. 获取更精确的时间:gettimeofday()

gettimeofday() 是一个提供微秒精度的函数,它返回当前时间的秒数和微秒数。与 time() 函数相比,gettimeofday() 能提供更高的精度,常用于性能测量和高精度定时操作。

示例代码:使用 gettimeofday() 获取当前时间
#include <iostream>
#include <sys/time.h>int main() {struct timeval tv;gettimeofday(&tv, NULL);  // 获取当前时间(精确到微秒)std::cout << "当前时间: " << tv.tv_sec << " 秒和 " << tv.tv_usec << " 微秒,自 Unix 纪元以来。" << std::endl;return 0;
}

6. 程序暂停:sleep() 与 usleep()

在某些情况下,可能需要让程序暂停一段时间。Linux 提供了 sleep()usleep() 两个函数,分别用于暂停一定的秒数和微秒数。

  • sleep(seconds):暂停指定的秒数。
  • usleep(microseconds):暂停指定的微秒数。
示例代码:使用 sleep() 和 usleep() 暂停程序
#include <iostream>
#include <unistd.h>int main() {std::cout << "暂停 2 秒..." << std::endl;sleep(2);  // 暂停 2 秒std::cout << "暂停 500 毫秒..." << std::endl;usleep(500000);  // 暂停 500,000 微秒(即 0.5 秒)return 0;
}

7. 时区操作:tzset() 与环境变量

在 Linux 中,我们可以使用 tzset() 函数来设置程序的时区。通过修改环境变量 TZ,可以使程序按照指定的时区进行时间转换。

示例代码:设置时区并输出本地时间
#include <iostream>
#include <ctime>int main() {setenv("TZ", "PST8PDT", 1);  // 设置时区为太平洋标准时间tzset();  // 更新时区设置time_t now = time(0);struct tm * timeinfo = localtime(&now);std::cout << "当前 PST 时间: " << asctime(timeinfo);return 0;
}

8. 总结

Linux 提供了多种强大的时间操作工具,从基本的 time_ttm 结构体,到高精度的 chrono 库,再到支持微秒级精度的 gettimeofday()。不同的函数和库满足了不同场景下对时间的需求,比如获取当前时间、进行时间测量、暂停程序执行、以及处理不同的时区。


http://www.ppmy.cn/ops/152126.html

相关文章

Java TCP可靠传输(1)

TCP 可靠传输 一. 确认应答 由发送方填充&#xff0c;再由接收方在序号的基础上1&#xff0c;填充到确认序号中&#xff0c;来表示已经接收到前面发送的&#xff0c;表明下一个从哪个位置发送。 二. 超时重传 数据在网络上传输时会经过很多网络设备&#xff0c;如果其中一个…

嵌入式知识体系分析+数据结构概念+时间复杂度计算规则+顺序表的原理与实现

数据结构概述 基本概念 数据结构指的是计算机存储数据和组织数据的方式&#xff0c;存储数据和组织数据的目的是为了后期对数据的再次利用&#xff0c;所以存储的数据一般是具有一个或者多个特定关系的集合&#xff0c;利用不同的数据结构可以提高数据的访问效率。 思考&am…

26岁备考PMP,经验分享

26岁普通女孩因考了个PMP.... 突然好喜欢现在的自己&#xff5e; 现在的生活尽管没有很富有&#xff0c;但我现在工作真的很满意&#xff0c;周末双休薪资也不错&#xff0c;没有依靠任何人&#xff0c;全都是我自己努力得来的。 想想以前的我因为学历自卑&#xff0c;到处讨好…

第四届机器学习、云计算与智能挖掘国际会议

一、会议信息 会议名称&#xff1a;第四届机器学习、云计算与智能挖掘国际会议&#xff08;MLCCIM 2025&#xff09;​​​​​​​ 会议地点&#xff1a;中国漠河 会议时间&#xff1a;2025年7月21-25日 支持单位&#xff1a;佛山市人工智能学会、佛山大学 二、大会主席 …

go语言zero框架通过chromedp实现网页在线截图的设计与功能实现

在 GoZero 框架中实现网页在线截图的功能&#xff0c;可以通过集成 chromedp 库来控制 Chrome 浏览器进行截图。chromedp 是一个基于 Chrome DevTools 协议的 Go 包&#xff0c;可以用来在 Go 程序中模拟浏览器操作&#xff0c;如页面截图、DOM 操作、表单提交等。 下面是一个…

CSDN年度回顾:技术征途上的坚实步伐

嘿&#xff0c;时光过得可真快呀&#xff0c;就像那匹跑得飞快的白马&#xff0c;嗖的一下&#xff0c;2024 年的日历就这么悄无声息地翻到了最后一页。这会儿我回头看看在 CSDN 上度过的这一年&#xff0c;心里那叫一个感慨万千&#xff0c;满满的都是喜悦&#xff0c;就像心里…

搭建一个基于Spring Boot的校园台球厅人员与设备管理系统

搭建一个基于Spring Boot的校园台球厅人员与设备管理系统可以涵盖多个功能模块&#xff0c;例如用户管理、设备管理、预约管理、计费管理等。以下是一个简化的步骤指南&#xff0c;帮助你快速搭建一个基础的系统。 — 1. 项目初始化 使用 Spring Initializr 生成一个Spring …

从 Web1 到 Web3:互联网发展的历史与未来

从 Web1 到 Web3&#xff1a;互联网发展的历史与未来 导语 互联网的演变已经经历了多个重要的阶段&#xff0c;从最初的 Web1 到如今的 Web3&#xff0c;这一路走来&#xff0c;每一次的技术进步和理念创新都极大地改变了我们与世界互动的方式。从简单的信息传递到如今的去中…