C语言中RTC时间与时间戳的互相转换详解
创作时间:
作者:
@小白创作中心
C语言中RTC时间与时间戳的互相转换详解
引用
CSDN
1.
https://blog.csdn.net/weixin_46158019/article/details/139473933
在C语言编程中,时间处理是一个常见的需求,特别是在嵌入式系统和实时系统中。本文将详细介绍如何将RTC时间(年月日时分秒)转换为时间戳,以及如何将时间戳转换回RTC时间信息。通过具体的代码示例,帮助读者掌握这一实用技能。
一、介绍
在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;
}
热门推荐
装修必看:全面掌握家庭插座布局,让使用更便捷安全
职场人士如何避免脊椎侧弯?索南昂秀医生支招
青海省人民医院专家提醒:这些习惯正在悄悄伤害孩子的脊柱
脊柱侧弯患者的康复训练秘籍
脊椎侧弯早知道:从自测到预防,专家教你这样守护孩子健康
脊柱侧弯青少年如何走出心理阴影?
广州到武汉自驾途中,这个休息站值得一停!
广州到武汉自驾游攻略:沿途四大城市景点美食住宿全攻略
泉州晋江旅游必打卡十大景点
大疆无人机新手指南:从入门到飞行
世界爱虎日:守护森林之王,我们在行动
赴美旅游必知文化禁忌:小心被罚款!
告别驼背,练出直角肩!YTWL训练让你轻松改善肩背姿态
告别驼背:从医学视角解读成因与解决方案
华脊道研究:驼背不仅影响外观,还可能损害心理健康
微信Windows版3.9.10版本更新:新增文字消息放大阅读功能
量子计算时代的量子化学
北美影院:一场华丽转身,超越“看电影”的全方位娱乐体验
烘焙入门必修课:如何精准称量面粉?
烘焙小窍门:没有厨房秤,如何准确量取100克面粉?
重建南极绕极流500万年变化历史 揭洋流与大气相互作用之密
大便变绿?别慌,可能是你吃多了这些菜
石狮:从千年古建到文旅新地标
狮子成百兽之王的秘密大揭秘!
从动画到现实:揭秘“百兽之王”的生存现状
亚伯拉罕:耶和华崇拜的起点
乌干达国家公园:看狮子如何爬树
狮子:草原生态卫士,你了解多少?
美洲狮:独行者的生存智慧
家庭减压新选择:个人心理咨询的专业支持