当前位置: 代码网 > it编程>编程语言>C/C++ > C语言时间转换函数接口的用法全面讲解

C语言时间转换函数接口的用法全面讲解

2026年01月06日 C/C++ 我要评论
概述在c语言中,时间转换<time.h>:提供了时间处理的相关函数和类型。常用类型:time_t(表示时间戳,通常是long类型)、struct tm(分解时间结构体)等。函数接口主要涉及

概述

在c语言中,时间转换<time.h>:提供了时间处理的相关函数和类型。常用类型:time_t(表示时间戳,通常是long类型)、struct tm(分解时间结构体)等。函数接口主要涉及以下几个头文件和函数。本文主要介绍这些函数的常用使用方法。

1 时间函数接口

1.1 接口函数介绍

在c语言中,时间转换函数接口主要涉及以下几个头文件和函数:

  1. <time.h>:提供了时间处理的相关函数和类型。
  2. 常用类型:time_t(表示时间戳,通常是long类型)、struct tm(分解时间结构体)等。

常用的时间转换函数包括:

  • time_t time(time_t *tloc);   获取当前时间的时间戳。
  • struct tm *localtime(const time_t *timep); 将时间戳转换为本地时间的struct tm结构。
  • struct tm *gmtime(const time_t *timep); 将时间戳转换为utc时间的struct tm结构。
  • time_t mktime(struct tm *tm); 将struct tm结构的时间转换为时间戳(本地时间)。
  • char *asctime(const struct tm *tm); 将struct tm结构的时间转换为字符串(格式固定)。
  • char *ctime(const time_t *timep); 将时间戳转换为本地时间的字符串(格式固定)。

格式化函数:

  • size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr);
    用于将struct tm格式的时间按照指定格式转换为字符串。

1.2 功能函数说明

1) c语言中常用的时间转换函数接口,包括:

  1. 获取当前时间 - 使用time()函数获取时间戳,localtime()gmtime()转换为本地时间和utc时间
  2. 时间转换为字符串 - 使用asctime()ctime()函数
  3. 自定义时间格式 - 使用strftime()函数实现灵活的格式输出
  4. 计算时间差 - 使用difftime()函数计算两个时间点之间的差异
  5. 时间操作 - 使用mktime()函数对时间结构进行规范化并实现日期计算

2) tm 数据结构

//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//
// types
//
//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
struct tm
{
    int tm_sec;   // seconds after the minute - [0, 60] including leap second
    int tm_min;   // minutes after the hour - [0, 59]
    int tm_hour;  // hours since midnight - [0, 23]
    int tm_mday;  // day of the month - [1, 31]
    int tm_mon;   // months since january - [0, 11]
    int tm_year;  // years since 1900
    int tm_wday;  // days since sunday - [0, 6]
    int tm_yday;  // days since january 1 - [0, 365]
    int tm_isdst; // daylight savings time flag
};

2 c语言时间转换函数接口应用

下面我将创建一个c语言程序,展示常见的时间转换函数接口及其使用方法。这个程序会演示如何获取当前时间、转换时间格式以及进行各种时间操作。

2.1 获取当前时间

c语言使用time()函数获取时间戳,localtime()gmtime()转换为本地时间和utc时间。

void print_current_time()
 {
    printf("1. 当前时间:\n");
    
    time_t raw_time;
    struct tm *time_info;
    
    // 获取当前时间戳
    time(&raw_time);
    
    // 转换为本地时间结构
    time_info = localtime(&raw_time);
    
    printf("   时间戳: %ld\n", raw_time);
    printf("   本地时间: %d-%02d-%02d %02d:%02d:%02d\n",
           time_info->tm_year + 1900, time_info->tm_mon + 1, time_info->tm_mday,
           time_info->tm_hour, time_info->tm_min, time_info->tm_sec);
    
    // 转换为utc时间
    time_info = gmtime(&raw_time);
    printf("   utc时间: %d-%02d-%02d %02d:%02d:%02d\n",
           time_info->tm_year + 1900, time_info->tm_mon + 1, time_info->tm_mday,
           time_info->tm_hour, time_info->tm_min, time_info->tm_sec);
}

运行程序,得到结果如下:

1. 当前时间:
   时间戳: 1757555139
   本地时间: 2025-09-11 09:45:39
   utc时间: 2025-09-11 01:45:39

2.2  时间转换为字符串

使用asctime()ctime()函数用于时间转换为字符串 ,其用法如下:

// 将时间转换为字符串
void convert_time_to_string() 
{
    printf("2. 时间转换为字符串:\n");
    
    time_t raw_time;
    char buffer[80];
    
    time(&raw_time);
    
    // 使用asctime转换为字符串
    printf("   asctime格式: %s", asctime(localtime(&raw_time)));
    
    // 使用ctime转换为字符串
    printf("   ctime格式: %s", ctime(&raw_time));
}

运行结果如下:

2. 时间转换为字符串:
   asctime格式: thu sep 11 09:49:05 2025
   ctime格式: thu sep 11 09:49:05 2025

2.3 计算时间差

使用difftime()函数计算两个时间点之间的差异,其用法如下:

// 计算时间差
void calculate_time_difference() {
    printf("4. 计算时间差:\n");
    
    time_t start, end;
    double diff;
    
    time(&start);
    printf("   开始时间: %s", ctime(&start));
    
    // 模拟一些耗时操作
    for (long i = 0; i < 100000000; i++) {
        // 空循环
    }
    
    time(&end);
    printf("   结束时间: %s", ctime(&end));
    
    diff = difftime(end, start);
    printf("   耗时: %.2f 秒\n", diff);
}

运行结果如下:

4. 计算时间差:
   开始时间: thu sep 11 09:51:36 2025
   结束时间: thu sep 11 09:51:37 2025
   耗时: 1.00 秒

2.4 时间操作

// 时间操作
void manipulate_time() 
{
    printf("5. 时间操作:\n");
    
    time_t raw_time;
    struct tm *time_info;
    char buffer[80];
    
    time(&raw_time);
    time_info = localtime(&raw_time);
    
    printf("   当前时间: %s", asctime(time_info));
    
    // 增加一天
    time_info->tm_mday += 1;
    mktime(time_info); // 规范化时间结构
    strftime(buffer, sizeof(buffer), "%y-%m-%d", time_info);
    printf("   明天日期: %s\n", buffer);
    
    // 减少一周
    time_info->tm_mday -= 7;
    mktime(time_info);
    strftime(buffer, sizeof(buffer), "%y-%m-%d", time_info);
    printf("   一周前日期: %s\n", buffer);
}

运行结果如下:

5. 时间操作:
   当前时间: thu sep 11 09:53:44 2025
   明天日期: 2025-09-12
   一周前日期: 2025-09-05

2.5 源代码文件

#define _crt_secure_no_warnings
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <stdint.h>
#include <stddef.h>
#include <errno.h>
#include <stdbool.h>

// 函数声明
void print_current_time();
void convert_time_to_string();
void custom_time_format();
void calculate_time_difference();
void manipulate_time();

int test_rtc_main() 
{
    printf("c语言时间转换函数接口示例\n");
    printf("==========================\n\n");

    // 1. 打印当前时间
    print_current_time();
    printf("\n");

    // 2. 时间转换为字符串
    convert_time_to_string();
    printf("\n");

    // 3. 自定义时间格式
    custom_time_format();
    printf("\n");

    // 4. 计算时间差
    calculate_time_difference();
    printf("\n");

    // 5. 时间操作
    manipulate_time();

    return 0;
}

// 打印当前时间
void print_current_time() 
{
    printf("1. 当前时间:\n");

    time_t raw_time;
    struct tm* time_info;

    // 获取当前时间戳
    time(&raw_time);

    // 转换为本地时间结构
    time_info = localtime(&raw_time);

    printf("   时间戳: %ld\n", raw_time);
    printf("   本地时间: %d-%02d-%02d %02d:%02d:%02d\n",
             time_info->tm_year + 1900, time_info->tm_mon + 1, time_info->tm_mday,
             time_info->tm_hour, time_info->tm_min, time_info->tm_sec);

    // 转换为utc时间
    time_info = gmtime(&raw_time);
    printf("   utc时间: %d-%02d-%02d %02d:%02d:%02d\n",
        time_info->tm_year + 1900, time_info->tm_mon + 1, time_info->tm_mday,
        time_info->tm_hour, time_info->tm_min, time_info->tm_sec);
}

// 将时间转换为字符串
void convert_time_to_string() 
{
    printf("2. 时间转换为字符串:\n");

    time_t raw_time;
    char buffer[80];

    time(&raw_time);

    // 使用asctime转换为字符串
    printf("   asctime格式: %s", asctime(localtime(&raw_time)));

    // 使用ctime转换为字符串
    printf("   ctime格式: %s", ctime(&raw_time));
}

// 自定义时间格式
void custom_time_format() 
{
    printf("3. 自定义时间格式:\n");

    time_t raw_time;
    struct tm* time_info;
    char buffer[80];

    time(&raw_time);
    time_info = localtime(&raw_time);

    // 使用strftime自定义格式
    strftime(buffer, sizeof(buffer), "%y年%m月%d日 %h时%m分%s秒", time_info);
    printf("   中文格式: %s\n", buffer);

    strftime(buffer, sizeof(buffer), "%a, %b %d, %y", time_info);
    printf("   英文格式: %s\n", buffer);

    strftime(buffer, sizeof(buffer), "日期: %y-%m-%d 时间: %h:%m:%s", time_info);
    printf("   自定义格式: %s\n", buffer);
}

// 计算时间差
void calculate_time_difference() {
    printf("4. 计算时间差:\n");

    time_t start, end;
    double diff;

    time(&start);
    printf("   开始时间: %s", ctime(&start));

    // 模拟一些耗时操作
    for (long i = 0; i < 100000000; i++) {
        // 空循环
    }

    time(&end);
    printf("   结束时间: %s", ctime(&end));

    diff = difftime(end, start);
    printf("   耗时: %.2f 秒\n", diff);
}

// 时间操作
void manipulate_time() {
    printf("5. 时间操作:\n");

    time_t raw_time;
    struct tm* time_info;
    char buffer[80];

    time(&raw_time);
    time_info = localtime(&raw_time);

    printf("   当前时间: %s", asctime(time_info));

    // 增加一天
    time_info->tm_mday += 1;
    mktime(time_info);      // 规范化时间结构
    strftime(buffer, sizeof(buffer), "%y-%m-%d", time_info);
    printf("   明天日期: %s\n", buffer);

    // 减少一周
    time_info->tm_mday -= 7;
    mktime(time_info);
    strftime(buffer, sizeof(buffer), "%y-%m-%d", time_info);
    printf("   一周前日期: %s\n", buffer);
}


// 将日期时间转换为unix时间戳
void convert_human_to_unix(int year, int month, int day, int hour, int min, int sec) 
{
    struct tm timeinfo;
    time_t timestamp;

    // 填充tm结构
    memset(&timeinfo, 0, sizeof(struct tm));
    timeinfo.tm_year = year - 1900;  // 年份从1900开始计算
    timeinfo.tm_mon = month - 1;     // 月份从0开始
    timeinfo.tm_mday = day;
    timeinfo.tm_hour = hour;
    timeinfo.tm_min = min;
    timeinfo.tm_sec = sec;
    timeinfo.tm_isdst = -1;  // 让系统自动确定夏令时

    // 转换为unix时间戳
    timestamp = mktime(&timeinfo);

    if (timestamp == -1) {
        printf("   %04d-%02d-%02d %02d:%02d:%02d -> 无效时间\n",
            year, month, day, hour, min, sec);
    }
    else {
        printf("   %04d-%02d-%02d %02d:%02d:%02d -> %ld\n",
            year, month, day, hour, min, sec, timestamp);
    }
}

到此这篇关于c语言时间转换函数接口的用法详解的文章就介绍到这了,更多相关c时间转换函数接口用法内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com