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

 更新时间:2026年01月06日 09:46:28   作者:mftang  
这篇文章主要介绍了C语言中时间处理的常用类型和函数,包括time_t、structtm等,以及time()、localtime()、gmtime()、mktime()、asctime()、ctime()和strftime()等,通过一个示例程序,展示了如何获取当前时间、转换时间格式、计算时间差和进行时间操作

概述

在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时间转换函数接口用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++按照正态分布来排列整型数组元素

    C++按照正态分布来排列整型数组元素

    这篇文章主要介绍了C++按照正态分布来排列整型数组元素的相关资料,需要的朋友可以参考下
    2016-07-07
  • C语言实现生日贺卡

    C语言实现生日贺卡

    这篇文章主要为大家详细介绍了C语言实现生日贺卡的具体方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • Qt Creator实现代码保存自动格式化功能

    Qt Creator实现代码保存自动格式化功能

    本文详细介绍如何在QtCreator中设置代码自动保存格式化功能,通过配置ClangFormat和Beautifier工具,实现开发时专注逻辑化,保存时自动美化,提升团队效率与代码可读性,需要的朋友可以参考下
    2026-06-06
  • C语言for语句用法详解

    C语言for语句用法详解

    今天,小编讲诉C语言中循环语句(for)的使用方法,作为示例,以一个简单的例子讲诉for语法。
    2015-11-11
  • 利用上下文属性将 C++ 对象嵌入 QML 里

    利用上下文属性将 C++ 对象嵌入 QML 里

    这篇文章主要介绍了利用上下文属性将 C++ 对象嵌入 QML里,将 QML 对象加载到 C++ 应用程序中时,直接嵌入一些可在 QML 代码中使用的 C++ 数据会很有用。例如,这使得在嵌入对象上调用 C++ 方法或使用 C++ 对象实例作为 QML 视图的数据模型成为可能,下面一起来学习该内容吧
    2021-12-12
  • C++使用libcurl轻松实现文件下载

    C++使用libcurl轻松实现文件下载

    这篇文章将用最简单的方式,带大家掌握C++ + libcurl实现文件下载的核心技术,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2025-08-08
  • Qt学习之QListWidget控件的使用教程详解

    Qt学习之QListWidget控件的使用教程详解

    这篇文章主要为大家详细介绍了Qt中QListWidget控件的使用教程,文中的示例代码讲解详细,对我们学习Qt有一定的帮助,需要的可以参考一下
    2022-12-12
  • C++跳转语句之Goto对变量定义的影响详解

    C++跳转语句之Goto对变量定义的影响详解

    goto语句也被称为无条件转移语句,这篇文章主要介绍了C++跳转语句之Goto对变量定义的影响,文中通过示例代码解文字介绍的很详细,相信对大家的理解和学习具有一定的参考借鉴价值,有需要的朋友们下面跟着小编一起来学习学习吧。
    2016-11-11
  • C语言中字符串与各数值类型之间的转换方法

    C语言中字符串与各数值类型之间的转换方法

    这篇文章主要介绍了C语言中字符串与各数值类型之间的转换方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • C语言中栈的两种实现方法

    C语言中栈的两种实现方法

    栈的实现方式有两种,一种方法是使用指针,而另一种方法则是使用数组,这篇文章主要介绍了C语言中栈的两种实现方法,需要的朋友可以参考下
    2021-08-08

最新评论