time 函数详解 链接到标题
1. 函数介绍 链接到标题
time
是C标准库函数,用于获取当前的日历时间(calendar time)。它返回从UNIX纪元(1970年1月1日00:00:00 UTC)开始经过的秒数,是获取系统时间最基础和常用的函数之一。
2. 函数原型 链接到标题
#include <time.h>
time_t time(time_t *tloc);
3. 功能 链接到标题
time
函数获取当前的日历时间,以秒为单位表示。它既可以返回时间值,也可以将时间值存储到指定的指针位置。
4. 参数 链接到标题
- *time_t tloc: 指向存储时间值的指针(NULL表示不存储到指针,仅返回值)
5. 返回值 链接到标题
- 成功: 返回当前日历时间(秒数)
- 失败: 返回-1,并设置errno(很少见)
6. 相似函数,或关联函数 链接到标题
- gettimeofday: 获取高精度时间(微秒)
- clock_gettime: 获取高精度时间(纳秒)
- ftime: 获取时间和时区信息(已废弃)
- localtime/gmtime: 时间转换函数
- strftime: 格式化时间字符串
7. 示例代码 链接到标题
示例1:基础time使用 链接到标题
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
/**
* 演示基础time使用方法
*/
int demo_time_basic() {
time_t raw_time;
struct tm *time_info;
char time_string[128];
printf("=== 基础time使用示例 ===\n");
// 方法1:使用返回值获取时间
printf("1. 使用返回值获取时间:\n");
raw_time = time(NULL);
if (raw_time == (time_t)-1) {
printf(" 获取时间失败: %s\n", strerror(errno));
return -1;
}
printf(" 当前时间戳: %ld\n", (long)raw_time);
// 方法2:使用参数存储时间
printf("\n2. 使用参数存储时间:\n");
time_t stored_time;
time_t result = time(&stored_time);
if (result == (time_t)-1) {
printf(" 获取时间失败: %s\n", strerror(errno));
return -1;
}
printf(" 存储的时间戳: %ld\n", (long)stored_time);
printf(" 返回的时间戳: %ld\n", (long)result);
printf(" 两者是否相等: %s\n", (stored_time == result) ? "是" : "否");
// 显示人类可读的时间格式
printf("\n3. 人类可读的时间格式:\n");
// 转换为本地时间
time_info = localtime(&raw_time);
strftime(time_string, sizeof(time_string), "%Y-%m-%d %H:%M:%S", time_info);
printf(" 本地时间: %s\n", time_string);
// 转换为UTC时间
time_info = gmtime(&raw_time);
strftime(time_string, sizeof(time_string), "%Y-%m-%d %H:%M:%S UTC", time_info);
printf(" UTC时间: %s\n", time_string);
// 显示星期信息
time_info = localtime(&raw_time);
strftime(time_string, sizeof(time_string), "%A, %B %d, %Y", time_info);
printf(" 详细日期: %s\n", time_string);
return 0;
}
int main() {
return demo_time_basic();
}
示例2:时间测量和性能测试 链接到标题
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <math.h>
/**
* 模拟耗时操作
*/
void simulate_work(int seconds) {
volatile double sum = 0;
time_t start_time = time(NULL);
time_t current_time;
printf(" 开始模拟工作 %d 秒...\n", seconds);
do {
// 执行一些计算以消耗CPU时间
for (int i = 0; i < 1000000; i++) {
sum += sqrt(i);
}
current_time = time(NULL);
} while (current_time - start_time < seconds);
printf(" 工作完成,实际耗时: %ld 秒\n", current_time - start_time);
}
/**
* 演示时间测量和性能测试
*/
int demo_time_measurement() {
time_t start_time, end_time;
double elapsed_time;
printf("=== 时间测量和性能测试示例 ===\n");
// 测试1:简单的时间间隔测量
printf("1. 简单时间间隔测量:\n");
start_time = time(NULL);
printf(" 开始时间: %ld\n", (long)start_time);
// 模拟一些工作
printf(" 执行工作...\n");
sleep(3);
end_time = time(NULL);
printf(" 结束时间: %ld\n", (long)end_time);
elapsed_time = difftime(end_time, start_time);
printf(" 耗时: %.0f 秒\n", elapsed_time);
// 测试2:精确的时间测量
printf("\n2. 精确时间测量:\n");
start_time = time(NULL);
// 执行更精确的测量
simulate_work(2);
end_time = time(NULL);
elapsed_time = difftime(end_time, start_time);
printf(" 精确测量耗时: %.0f 秒\n", elapsed_time);
// 测试3:循环性能测试
printf("\n3. 循环性能测试:\n");
const int iterations = 5;
time_t iteration_times[iterations];
time_t total_elapsed = 0;
for (int i = 0; i < iterations; i++) {
printf(" 第 %d 次迭代:\n", i + 1);
start_time = time(NULL);
// 执行不同类型的工作
if (i % 2 == 0) {
sleep(1); // 睡眠操作
} else {
simulate_work(1); // CPU密集型操作
}
end_time = time(NULL);
iteration_times[i] = end_time - start_time;
total_elapsed += iteration_times[i];
printf(" 耗时: %ld 秒\n", (long)iteration_times[i]);
}
printf("\n 性能统计:\n");
printf(" 总耗时: %ld 秒\n", (long)total_elapsed);
printf(" 平均耗时: %.2f 秒\n", (double)total_elapsed / iterations);
// 找出最快和最慢的迭代
time_t min_time = iteration_times[0], max_time = iteration_times[0];
int min_index = 0, max_index = 0;
for (int i = 1; i < iterations; i++) {
if (iteration_times[i] < min_time) {
min_time = iteration_times[i];
min_index = i;
}
if (iteration_times[i] > max_time) {
max_time = iteration_times[i];
max_index = i;
}
}
printf(" 最快迭代: 第 %d 次 (%ld 秒)\n", min_index + 1, (long)min_time);
printf(" 最慢迭代: 第 %d 次 (%ld 秒)\n", max_index + 1, (long)max_time);
return 0;
}
int main() {
return demo_time_measurement();
}
示例3:定时器和调度器 链接到标题
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
/**
* 简单定时器结构
*/
typedef struct {
time_t start_time;
time_t interval;
time_t last_trigger;
int trigger_count;
int active;
void (*callback)(int count);
} simple_timer_t;
/**
* 定时器回调函数
*/
void timer_callback(int count) {
time_t current_time = time(NULL);
printf("⏰ 定时器触发 #%d (时间: %ld)\n", count, (long)current_time);
}
/**
* 初始化定时器
*/
void init_timer(simple_timer_t *timer, time_t interval_seconds) {
timer->start_time = time(NULL);
timer->interval = interval_seconds;
timer->last_trigger = timer->start_time;
timer->trigger_count = 0;
timer->active = 1;
timer->callback = timer_callback;
printf("⏱️ 定时器初始化完成:\n");
printf(" 启动时间: %ld\n", (long)timer->start_time);
printf(" 间隔时间: %ld 秒\n", (long)timer->interval);
}
/**
* 检查定时器是否应该触发
*/
int check_timer(simple_timer_t *timer) {
if (!timer->active) {
return 0;
}
time_t current_time = time(NULL);
time_t elapsed = current_time - timer->last_trigger;
if (elapsed >= timer->interval) {
timer->trigger_count++;
timer->last_trigger = current_time;
if (timer->callback) {
timer->callback(timer->trigger_count);
}
return 1;
}
return 0;
}
/**
* 显示定时器状态
*/
void show_timer_status(simple_timer_t *timer) {
time_t current_time = time(NULL);
time_t running_time = current_time - timer->start_time;
time_t next_trigger = timer->interval - (current_time - timer->last_trigger);
if (next_trigger < 0) next_trigger = 0;
printf("📊 定时器状态:\n");
printf(" 运行时间: %ld 秒\n", (long)running_time);
printf(" 触发次数: %d\n", timer->trigger_count);
printf(" 下次触发: %ld 秒后\n", next_trigger);
printf(" 状态: %s\n", timer->active ? "激活" : "停止");
}
/**
* 演示定时器和调度器
*/
int demo_timer_scheduler() {
simple_timer_t timer;
const int run_duration = 30; // 运行30秒
time_t start_time, current_time;
printf("=== 定时器和调度器示例 ===\n");
// 初始化定时器(每5秒触发一次)
init_timer(&timer, 5);
printf("\n🚀 开始定时器演示 (持续 %d 秒):\n", run_duration);
start_time = time(NULL);
while (1) {
current_time = time(NULL);
// 检查是否超时
if (current_time - start_time >= run_duration) {
printf("\n⏳ 演示时间到,停止定时器\n");
break;
}
// 检查定时器
check_timer(&timer);
// 每3秒显示一次状态
static time_t last_status = 0;
if (current_time - last_status >= 3) {
show_timer_status(&timer);
last_status = current_time;
}
// 短暂休眠以减少CPU使用
usleep(100000); // 100ms
}
// 显示最终统计
printf("\n🏁 定时器演示完成:\n");
show_timer_status(&timer);
printf("\n📈 最终统计:\n");
printf(" 总运行时间: %ld 秒\n", (long)(current_time - start_time));
printf(" 预期触发次数: %ld\n", (long)(run_duration / timer.interval));
printf(" 实际触发次数: %d\n", timer.trigger_count);
printf(" 触发率: %.1f%%\n",
(double)timer.trigger_count / (run_duration / timer.interval) * 100);
return 0;
}
int main() {
return demo_timer_scheduler();
}
示例4:时间转换和格式化 链接到标题
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
/**
* 显示多种时间格式
*/
void show_multiple_time_formats(time_t raw_time) {
struct tm *time_info;
char buffer[256];
printf("=== 多种时间格式展示 ===\n");
printf("基准时间戳: %ld\n\n", (long)raw_time);
// 本地时间格式
printf("🌍 本地时间格式:\n");
time_info = localtime(&raw_time);
// 标准格式
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", time_info);
printf(" 标准格式: %s\n", buffer);
// 详细格式
strftime(buffer, sizeof(buffer), "%A, %B %d, %Y at %I:%M:%S %p", time_info);
printf(" 详细格式: %s\n", buffer);
// 简洁格式
strftime(buffer, sizeof(buffer), "%x %X", time_info);
printf(" 系统格式: %s\n", buffer);
// UTC时间格式
printf("\n🌐 UTC时间格式:\n");
time_info = gmtime(&raw_time);
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S UTC", time_info);
printf(" UTC格式: %s\n", buffer);
strftime(buffer, sizeof(buffer), "%a, %d %b %Y %H:%M:%S GMT", time_info);
printf(" RFC格式: %s\n", buffer);
// 特殊格式
printf("\n🎨 特殊时间格式:\n");
// ISO 8601格式
time_info = localtime(&raw_time);
strftime(buffer, sizeof(buffer), "%Y-%m-%dT%H:%M:%S%z", time_info);
printf(" ISO 8601: %s\n", buffer);
// Unix时间戳
printf(" Unix时间戳: %ld\n", (long)raw_time);
// 星期和月份
strftime(buffer, sizeof(buffer), "今天是%A,%B的第%d天", time_info);
printf(" 中文格式: %s\n", buffer);
// 年份信息
strftime(buffer, sizeof(buffer), "今年第%j天,第%U周", time_info);
printf(" 年度信息: %s\n", buffer);
}
/**
* 时间转换函数
*/
void demonstrate_time_conversions() {
time_t raw_time;
struct tm time_struct;
time_t converted_time;
printf("=== 时间转换演示 ===\n");
// 获取当前时间
raw_time = time(NULL);
printf("1. 当前时间戳: %ld\n", (long)raw_time);
// 转换为时间结构体
struct tm *local_time = localtime(&raw_time);
printf("2. 转换为本地时间结构:\n");
printf(" 年: %d\n", local_time->tm_year + 1900);
printf(" 月: %d\n", local_time->tm_mon + 1);
printf(" 日: %d\n", local_time->tm_mday);
printf(" 时: %d\n", local_time->tm_hour);
printf(" 分: %d\n", local_time->tm_min);
printf(" 秒: %d\n", local_time->tm_sec);
printf(" 星期: %d\n", local_time->tm_wday);
printf(" 年天数: %d\n", local_time->tm_yday);
printf(" 夏令时: %s\n", local_time->tm_isdst ? "是" : "否");
// 手动构建时间结构体
printf("\n3. 手动构建时间结构:\n");
memset(&time_struct, 0, sizeof(time_struct));
time_struct.tm_year = 123; // 2023年 (1900 + 123)
time_struct.tm_mon = 5; // 6月 (0-11)
time_struct.tm_mday = 15; // 15日
time_struct.tm_hour = 14; // 14时
time_struct.tm_min = 30; // 30分
time_struct.tm_sec = 0; // 0秒
time_struct.tm_isdst = -1; // 让系统自动判断夏令时
// 转换为时间戳
converted_time = mktime(&time_struct);
if (converted_time != (time_t)-1) {
printf(" 构建时间: 2023-06-15 14:30:00\n");
printf(" 对应时间戳: %ld\n", (long)converted_time);
// 验证转换
struct tm *verified_time = localtime(&converted_time);
printf(" 验证转换:\n");
printf(" %d-%02d-%02d %02d:%02d:%02d\n",
verified_time->tm_year + 1900,
verified_time->tm_mon + 1,
verified_time->tm_mday,
verified_time->tm_hour,
verified_time->tm_min,
verified_time->tm_sec);
} else {
printf(" 时间转换失败\n");
}
// 时间差计算
printf("\n4. 时间差计算:\n");
time_t past_time = raw_time - 86400; // 24小时前
double diff_seconds = difftime(raw_time, past_time);
printf(" 当前时间: %ld\n", (long)raw_time);
printf(" 过去时间: %ld\n", (long)past_time);
printf(" 时间差: %.0f 秒 (%.2f 小时)\n", diff_seconds, diff_seconds / 3600);
}
/**
* 演示时间格式化和转换
*/
int demo_time_formatting_conversion() {
time_t current_time;
printf("=== 时间格式化和转换演示 ===\n");
// 获取当前时间
current_time = time(NULL);
printf("当前时间戳: %ld\n\n", (long)current_time);
// 显示多种格式
show_multiple_time_formats(current_time);
printf("\n");
// 演示时间转换
demonstrate_time_conversions();
// 显示时间格式说明
printf("\n=== 时间格式说明 ===\n");
printf("%%Y: 四位数年份 (如 2023)\n");
printf("%%y: 两位数年份 (如 23)\n");
printf("%%m: 月份 (01-12)\n");
printf("%%d: 日期 (01-31)\n");
printf("%%H: 小时 (00-23)\n");
printf("%%M: 分钟 (00-59)\n");
printf("%%S: 秒 (00-59)\n");
printf("%%A: 完整星期名 (如 Monday)\n");
printf("%%a: 缩写星期名 (如 Mon)\n");
printf("%%B: 完整月份名 (如 January)\n");
printf("%%b: 缩写月份名 (如 Jan)\n");
printf("%%I: 12小时制小时 (01-12)\n");
printf("%%p: AM/PM\n");
printf("%%x: 本地日期格式\n");
printf("%%X: 本地时间格式\n");
printf("%%c: 本地日期时间格式\n");
return 0;
}
int main() {
return demo_time_formatting_conversion();
}
示例5:时间相关的实用工具 链接到标题
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/time.h>
/**
* 时间工具结构
*/
typedef struct {
time_t start_time;
time_t last_checkpoint;
unsigned long operation_count;
double total_elapsed_time;
} time_tool_t;
/**
* 初始化时间工具
*/
void init_time_tool(time_tool_t *tool) {
tool->start_time = time(NULL);
tool->last_checkpoint = tool->start_time;
tool->operation_count = 0;
tool->total_elapsed_time = 0.0;
printf("⏱️ 时间工具初始化完成\n");
printf(" 启动时间: %s", ctime(&tool->start_time));
}
/**
* 设置检查点
*/
double set_checkpoint(time_tool_t *tool, const char *checkpoint_name) {
time_t current_time = time(NULL);
double elapsed_since_last = difftime(current_time, tool->last_checkpoint);
double total_elapsed = difftime(current_time, tool->start_time);
tool->total_elapsed_time += elapsed_since_last;
tool->last_checkpoint = current_time;
tool->operation_count++;
printf("📍 检查点 [%s]:\n", checkpoint_name);
printf(" 距上次检查点: %.2f 秒\n", elapsed_since_last);
printf(" 总耗时: %.2f 秒\n", total_elapsed);
printf(" 操作次数: %lu\n", tool->operation_count);
return elapsed_since_last;
}
/**
* 时间戳转换器
*/
void timestamp_converter(time_t timestamp) {
struct tm *utc_time, *local_time;
char utc_str[64], local_str[64];
printf("🔄 时间戳转换器\n");
printf(" 输入时间戳: %ld\n", (long)timestamp);
// 转换为UTC时间
utc_time = gmtime(×tamp);
strftime(utc_str, sizeof(utc_str), "%Y-%m-%d %H:%M:%S UTC", utc_time);
printf(" UTC时间: %s\n", utc_str);
// 转换为本地时间
local_time = localtime(×tamp);
strftime(local_str, sizeof(local_str), "%Y-%m-%d %H:%M:%S %Z", local_time);
printf(" 本地时间: %s\n", local_str);
// 显示详细信息
printf(" 详细信息:\n");
printf(" 年: %d\n", local_time->tm_year + 1900);
printf(" 月: %d\n", local_time->tm_mon + 1);
printf(" 日: %d\n", local_time->tm_mday);
printf(" 时: %d\n", local_time->tm_hour);
printf(" 分: %d\n", local_time->tm_min);
printf(" 秒: %d\n", local_time->tm_sec);
printf(" 星期: %d (0=周日)\n", local_time->tm_wday);
printf(" 年天数: %d\n", local_time->tm_yday);
printf(" 夏令时: %s\n",
local_time->tm_isdst > 0 ? "是" : (local_time->tm_isdst == 0 ? "否" : "未知"));
}
/**
* 性能计时器
*/
typedef struct {
struct timeval start_time;
struct timeval end_time;
int running;
} performance_timer_t;
/**
* 启动性能计时器
*/
void start_performance_timer(performance_timer_t *timer) {
gettimeofday(&timer->start_time, NULL);
timer->running = 1;
printf("🏁 性能计时器启动\n");
}
/**
* 停止性能计时器
*/
double stop_performance_timer(performance_timer_t *timer) {
if (!timer->running) {
printf("❌ 计时器未启动\n");
return -1.0;
}
gettimeofday(&timer->end_time, NULL);
timer->running = 0;
double elapsed_time = (timer->end_time.tv_sec - timer->start_time.tv_sec) +
(timer->end_time.tv_usec - timer->start_time.tv_usec) / 1000000.0;
printf("⏱️ 性能计时器停止\n");
printf(" 耗时: %.6f 秒\n", elapsed_time);
printf(" 耗时: %.3f 毫秒\n", elapsed_time * 1000);
printf(" 耗时: %.0f 微秒\n", elapsed_time * 1000000);
return elapsed_time;
}
/**
* 演示时间相关的实用工具
*/
int demo_time_utilities() {
time_tool_t time_tool;
performance_timer_t perf_timer;
printf("=== 时间相关的实用工具演示 ===\n");
// 1. 时间工具演示
printf("\n1. 时间工具演示:\n");
init_time_tool(&time_tool);
// 模拟一些操作
sleep(1);
set_checkpoint(&time_tool, "操作1完成");
sleep(2);
set_checkpoint(&time_tool, "操作2完成");
sleep(1);
set_checkpoint(&time_tool, "操作3完成");
// 显示最终统计
printf("\n📊 最终统计:\n");
time_t final_time = time(NULL);
double total_time = difftime(final_time, time_tool.start_time);
printf(" 总运行时间: %.2f 秒\n", total_time);
printf(" 平均操作时间: %.2f 秒\n", total_time / time_tool.operation_count);
printf(" 操作频率: %.2f 次/秒\n", time_tool.operation_count / total_time);
// 2. 时间戳转换器演示
printf("\n2. 时间戳转换器演示:\n");
time_t current_timestamp = time(NULL);
timestamp_converter(current_timestamp);
printf("\n 历史时间戳转换:\n");
time_t historical_timestamp = 1609459200; // 2021-01-01 00:00:00 UTC
timestamp_converter(historical_timestamp);
// 3. 性能计时器演示
printf("\n3. 性能计时器演示:\n");
start_performance_timer(&perf_timer);
// 模拟一些精确计时的操作
volatile long sum = 0;
for (int i = 0; i < 1000000; i++) {
sum += i;
}
stop_performance_timer(&perf_timer);
// 4. 高精度性能测试
printf("\n4. 高精度性能对比:\n");
// 测试time()函数的精度
printf(" time()函数性能测试:\n");
start_performance_timer(&perf_timer);
volatile time_t time_result;
for (int i = 0; i < 100000; i++) {
time_result = time(NULL);
}
double time_overhead = stop_performance_timer(&perf_timer);
printf(" 100000次time()调用耗时: %.6f 秒\n", time_overhead);
printf(" 每次调用平均耗时: %.9f 秒\n", time_overhead / 100000);
// 5. 实用工具总结
printf("\n=== 实用工具总结 ===\n");
printf("1. 时间工具功能:\n");
printf(" ✓ 操作计时和性能分析\n");
printf(" ✓ 检查点设置和时间追踪\n");
printf(" ✓ 统计信息收集和分析\n");
printf("\n2. 时间戳转换器功能:\n");
printf(" ✓ Unix时间戳与人类可读格式互转\n");
printf(" ✓ UTC时间与本地时间转换\n");
printf(" ✓ 详细时间信息展示\n");
printf("\n3. 性能计时器功能:\n");
printf(" ✓ 高精度时间测量 (微秒级)\n");
printf(" ✓ 性能基准测试\n");
printf(" ✓ 算法性能对比\n");
printf("\n4. 使用建议:\n");
printf(" ✓ 根据精度需求选择合适的时间函数\n");
printf(" ✓ time()适用于秒级精度的简单计时\n");
printf(" ✓ gettimeofday()适用于微秒级精度\n");
printf(" ✓ clock_gettime()适用于纳秒级精度\n");
return 0;
}
int main() {
return demo_time_utilities();
}
time 使用注意事项 链接到标题
系统要求: 链接到标题
- C标准: 符合C89/C99/C11标准
- 平台支持: 所有支持POSIX的系统
- 编译器: 支持标准C库的所有编译器
精度考虑: 链接到标题
- 秒级精度: time()函数的固有限制
- 高精度需求: 使用gettimeofday()或clock_gettime()
- 时钟源: 不同系统可能有不同的时钟源
错误处理: 链接到标题
- 返回值检查: time()很少失败,但仍需检查返回值
- errno设置: 失败时会设置errno
- 边界情况: 处理时间溢出等极端情况
安全考虑: 链接到标题
- 时间戳安全: 避免时间戳相关的安全漏洞
- 时区处理: 正确处理时区转换
- 闰秒处理: 考虑闰秒对时间计算的影响
最佳实践: 链接到标题
- 精度匹配: 根据应用需求选择合适的时间函数
- 时区意识: 注意本地时间和UTC时间的区别
- 错误处理: 始终检查时间函数的返回值
- 性能考虑: 避免频繁的时间函数调用
- 格式化: 使用标准的时间格式化函数
time函数的特点和限制 链接到标题
优点: 链接到标题
- 简单易用: API简单直观
- 标准兼容: 广泛支持的标准函数
- 性能良好: 系统调用开销小
- 功能完整: 提供基本的时间操作功能
限制: 链接到标题
- 精度有限: 只能提供秒级精度
- 时区依赖: 需要考虑时区影响
- 溢出风险: 32位系统存在2038年问题
- 线程安全: 需要注意线程安全问题
相关函数对比 链接到标题
1. time vs gettimeofday: 链接到标题
// time(): 秒级精度
time_t t = time(NULL);
// gettimeofday(): 微秒级精度
struct timeval tv;
gettimeofday(&tv, NULL);
2. time vs clock_gettime: 链接到标题
// time(): 简单秒级时间
time_t t = time(NULL);
// clock_gettime(): 高精度时间
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
常见使用场景 链接到标题
1. 日志记录: 链接到标题
time_t now = time(NULL);
fprintf(logfile, "[%ld] Application started\n", (long)now);
2. 性能测量: 链接到标题
time_t start = time(NULL);
// 执行操作
time_t end = time(NULL);
double elapsed = difftime(end, start);
3. 定时任务: 链接到标题
time_t last_run = time(NULL);
while (1) {
time_t now = time(NULL);
if (difftime(now, last_run) >= INTERVAL_SECONDS) {
// 执行定时任务
last_run = now;
}
sleep(1);
}
4. 缓存过期: 链接到标题
typedef struct {
time_t created_time;
int ttl_seconds;
} cache_entry_t;
int is_expired(cache_entry_t *entry) {
time_t now = time(NULL);
return difftime(now, entry->created_time) > entry->ttl_seconds;
}
时间格式说明 链接到标题
常用格式化符号: 链接到标题
- %Y: 四位数年份
- %m: 月份 (01-12)
- %d: 日期 (01-31)
- %H: 小时 (00-23)
- %M: 分钟 (00-59)
- %S: 秒 (00-59)
标准时间格式: 链接到标题
// ISO 8601格式
strftime(buffer, size, "%Y-%m-%dT%H:%M:%S%z", tm_ptr);
// RFC 2822格式
strftime(buffer, size, "%a, %d %b %Y %H:%M:%S %z", tm_ptr);
总结 链接到标题
time
函数是C标准库中基础而重要的时间处理函数,提供了:
- 简单接口: 易于使用的API设计
- 标准兼容: 跨平台的标准化支持
- 基础功能: 满足大多数时间处理需求
- 性能优良: 低开销的时间获取
通过合理使用 time
函数及其相关工具,可以构建功能丰富的时钟应用、性能监控工具和系统管理程序。在实际应用中,需要根据具体需求选择合适的时间精度和处理方式。