一、介绍
在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;
}
测试结果: