C语言中RTC时间与时间戳的互相转换详解
创作时间:
2025-03-22 08:04:38
作者:
@小白创作中心
C语言中RTC时间与时间戳的互相转换详解
引用
CSDN
1.
https://blog.csdn.net/weixin_46158019/article/details/139473933
在C语言开发中,时间戳(Unix时间戳)和RTC时间(年月日时分秒)之间的转换是一个常见的需求。本文将详细介绍如何在C语言中实现这种转换,并提供具体的代码示例。
一、介绍
在C语言中,将年月日时分秒转换为时间戳(Unix时间戳,即从1970年1月1日00:00:00 UTC到现在的秒数)通常需要使用struct tm
结构体和timegm
或mktime
函数。需要注意的是,mktime
函数假设struct tm
是本地时间,而timegm
函数假设它是UTC时间。然而,标准的C库并没有直接提供timegm
函数,但在许多系统(如GNU C库)中可以找到它作为扩展。
如果没有timegm
函数,也可以使用mktime
和timezone
(或tzset
和localtime
与UTC之间的差异)来手动计算UTC时间戳。但请注意,这种方法可能不是跨平台的,并且可能依赖于本地系统的时区设置。
在C语言中,将时间戳(Unix时间戳)转换为年月日时分秒,可以使用localtime
函数,该函数会将一个时间戳转换为一个指向struct tm
结构体的指针,该结构体包含了分解后的日期和时间信息。
二、RTC时间信息转时间戳
测试代码
#include <stdio.h>
#include <time.h>
time_t convert_to_timestamp(int year, int month, int day, int hour, int minute, int second)
{
struct tm timeinfo = {0};
timeinfo.tm_year = year - 1900; // Year since 1900
timeinfo.tm_mon = month - 1; // Month since January. 0-11
timeinfo.tm_mday = day;
timeinfo.tm_hour = hour;
timeinfo.tm_min = minute;
timeinfo.tm_sec = second;
timeinfo.tm_isdst = -1; // Let mktime() determine if DST is in effect
// Note: mktime assumes local time, not UTC. If your local time is UTC, this is fine.
// Otherwise, you need to adjust for timezone differences.
return mktime(&timeinfo);
}
int main()
{
time_t timestamp = convert_to_timestamp(2024, 6, 5, 12, 30, 6);
if (timestamp == (time_t)-1)
{
perror("Error converting to timestamp");
return 1;
}
printf("Timestamp: %ld\n", (long)timestamp);
return 0;
}
测试结果
和时间戳在线工具比较
三、时间戳转RTC时间信息
测试代码
#include <stdio.h>
#include <time.h>
void timestamp_to_datetime(time_t timestamp, struct tm *datetime)
{
// 使用localtime函数将时间戳转换为本地时间(如果需要UTC时间,请使用gmtime)
*datetime = *localtime(×tamp);
// 输出日期和时间
printf("Year: %d\n", datetime->tm_year + 1900); // tm_year是从1900年开始的
printf("Month: %d\n", datetime->tm_mon + 1); // tm_mon是从0开始的
printf("Day: %d\n", datetime->tm_mday);
printf("Hour: %d\n", datetime->tm_hour);
printf("Minute: %d\n", datetime->tm_min);
printf("Second: %d\n", datetime->tm_sec);
}
int main()
{
// 假设我们有一个时间戳(例如,当前时间的时间戳)
//time_t timestamp = time(NULL); // 获取当前时间的时间戳
time_t timestamp =1717561806;
// 创建一个struct tm变量来存储转换后的日期和时间
struct tm datetime;
// 调用函数进行转换
timestamp_to_datetime(timestamp, &datetime);
return 0;
}
测试结果
四、综合例程
#include <stdio.h>
#include <time.h>
void timestamp_to_datetime(time_t timestamp, struct tm *datetime)
{
timestamp -= 8*60*60;
datetime = gmtime(×tamp);
// 输出日期和时间
printf("Year: %d\n", datetime->tm_year + 1900); // tm_year是从1900年开始的
printf("Month: %d\n", datetime->tm_mon + 1); // tm_mon是从0开始的
printf("Day: %d\n", datetime->tm_mday);
printf("Hour: %d\n", datetime->tm_hour);
printf("Minute: %d\n", datetime->tm_min);
printf("Second: %d\n", datetime->tm_sec);
}
time_t convert_to_timestamp(int year, int month, int day, int hour, int minute, int second)
{
struct tm timeinfo = {0};
timeinfo.tm_year = year - 1900; // Year since 1900
timeinfo.tm_mon = month - 1; // Month since January. 0-11
timeinfo.tm_mday = day;
timeinfo.tm_hour = hour;
timeinfo.tm_min = minute;
timeinfo.tm_sec = second;
timeinfo.tm_isdst = -1; // Let mktime() determine if DST is in effect
// Note: mktime assumes local time, not UTC. If your local time is UTC, this is fine.
// Otherwise, you need to adjust for timezone differences.
return mktime(&timeinfo);
}
int main()
{
// 假设我们有一个时间戳(例如,当前时间的时间戳)
//time_t timestamp = time(NULL); // 获取当前时间的时间戳
//北京时间 2024-08-21 16:11:57 1724227917
time_t timestamp = 0;//1724227917;
timestamp = convert_to_timestamp(2024, 8, 21, 16, 11, 57);
if (timestamp == (time_t)-1)
{
perror("Error converting to timestamp");
return 1;
}
// 创建一个struct tm变量来存储转换后的日期和时间
struct tm datetime;
// 调用函数进行转换
timestamp_to_datetime(timestamp, &datetime);
return 0;
}
在线测试
热门推荐
协和医生说|癫痫发作?一文教您应对方法
陈奕迅的1874的代表意义是什么
挂靠货车发生货运纠纷,看鄠邑法院如何判决!
使命召唤黑色行动6和战区迎来小型稳定性更新
打造精致网页设计,提升用户体验
如何改变性格缺陷:一个完整的自我提升指南
五路财神命格揭秘:财运亨通的秘密之道
楼上噪音扰民怎么办?从沟通到法律途径的全面解决方案
ACAIC 2024主题论坛:探索未来,下一代质谱技术创新与突破论坛成功召开
C# 如何解决chart控件显示数据量过大时的卡顿问题
如何查询科目三的预约成功情况?科目三预约成功的查询方法有哪些关键步骤?
深度剖析美国个人所得税:税率、优惠与应纳税额计算
信用逾期了失信人怎么办才能恢复信用?
梦见牙齿都掉了,周公解梦-梦境解析与心理暗示
【蓬江风物】她既是香港特别行政区的区花,还是清华大学的校花,你认识吗?
未雨绸缪方显军人本色:以学历与资格证升级助力"兵教师"职业转型
民国时期的老宅,改造成极具创意的院落
银行的金融科技应用的区块链供应链金融模式创新?
《棋士》:悬疑剧再出王炸!王宝强颠覆形象演绎“疯批棋手
常用电机选用指南:电机选型及方法详解
睡前喝什么促进睡眠
阳水命怎么样(阳水命格)(天河水命怎么样)
学生会秘书处的职能有哪些?
剁了3次排骨,终于明白:橱柜石英石台面和岩板台面哪个更好?
过敏性鼻炎眼睛痒用什么药效果最好
图像传感器 RGGB与 RYYB
过敏性鼻炎缠身难入眠?中医揭露「过敏三兄弟」自救秘方与保养关键
情绪管理之应激韧性的调节
刷体测成绩、立朋友圈人设…… 代跑步服务兴起之问: “预制健身”靠谱吗?
ICT企业数字化转型规划的制定与实施策略