C语言中RTC时间与时间戳的互相转换详解
创作时间:
作者:
@小白创作中心
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;
}
在线测试
热门推荐
冬季养生必备:老鸭炖天麻
与中年女性谈感情:建立信任比激情更重要
南宁黄焖狗肉走下餐桌,狗肉文化面临转型
金价触及2669美元后技术性整理,原油震荡下行压力增大
玉林夏至狗肉节:传统习俗遭遇现代文明挑战
哺乳期妇女慎用白芷粉:或影响乳汁分泌,应在医生指导下使用
腰背肌筋膜炎的家庭康复指南:10个实用训练动作
全球首例乙肝特异性T细胞疗法临床应用成功
肌筋膜炎日常保健新姿势
从汽车企业加班丑闻看996:如何破解恶性竞争下的劳动困局
南浔古镇:活着的江南水乡,中西合璧的建筑博物馆
996工作制违法且危害健康,多家企业取消彰显新风
阿里拼多多坚守996,字节腾讯推行人性化工作制
北京到大连冬季自驾攻略:车辆检查与安全驾驶指南
生物活性提升5倍,25羟基维生素D3助力肉牛养殖增效
早餐别再喝大米粥:营养单一且升糖指数高
从苦荞茶到水煮蛋:糖尿病患者的6种健康早餐选择
营养师推荐:三款健康早餐搭配,满足不同人群需求
使用可以显著降低尿蛋白的非奈利酮,至少要知道这些问题!
南天湖冰雪季开幕,重庆版“北海道”打造26项冬日活动
北京炸酱面、广州早茶:美食里的中国乡愁
范琳琳重唱《我热恋的故乡》,掀起80年代西北风回忆潮
腾格尔版《我热恋的故乡》走红网络,唤醒一代人乡愁记忆
从“西北风”到时代金曲:《我热恋的故乡》35年传唱史
9月去喀纳斯:赏五彩秋景,体验图瓦风情,附详细攻略
每天一句励志问候,助力孩子心理健康成长
覆卮山:秋日红枫中的5公里徒步,共护绿水青山
秋日摄影指南:用复古相机或手机拍出创意大片
感恩节:节日源流与暖心问候语集锦
研究证实:一句“早安”能让人一整天都快乐