文章目录
- Unix时间戳介绍
- UTC/GMT
- 时间戳转换
- 转换关系
- 代码测试
- 补充
Unix时间戳介绍
- Unix 时间戳(Unix Timestamp)定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数(以本初子午线为标准也就是伦敦时间),不考虑闰秒
- 时间戳存储在一个秒计数器中,秒计数器为32位/64位的整型变量,之前大多使用有符号32位秒计数器中,即在2038年会导致溢出,现在多用于有符号64位秒计数器
- 世界上所有时区的秒计数器相同,不同时区通过添加偏移来得到当地时间
实时时钟RTC框图
STM32使用的是无符号32位秒计算器,不会很快的溢出
UTC/GMT
- GMT(Greenwich Mean Time)格林尼治标准时间是一种以地球自转为基础的时间计量系统。它将地球自转一周的时间间隔等分为24小时,以此确定计时标准,但是地球的自转时间并不一致,会越来越慢,所以会导致此标准的一秒时间越来越长。
- UTC(Universal Time Coordinated)协调世界时是一种以原子钟为基础的时间计量系统。它规定铯133原子基态的两个超精细能级间在零磁场下跃迁辐射9,192,631,770周所持续的时间为1秒。当原子钟计时一天的时间与地球自转一周的时间相差超过0.9秒时,UTC会执行闰秒来保证其计时与地球自转的协调一致,即多执行一秒。
时间戳转换
C语言的time.h模块提供了时间获取和时间戳转换的相关函数,可以方便地进行秒计数器、日期时间和字符串之间的转换,以下是主要使用的函数:
转换关系
代码测试
使用代码来测试这些函数,使用devc++,读此时本机时间
#include <stdio.h>
#include <time.h>
time_t time_cnt; // 秒定时器数据类型,64位
time_t time_cnt_mk; // 用于mktime函数获取日期时间数据类型转秒定时器类型
struct tm time_date; // 日期时间数据类型
struct tm time_date_local; // 日期时间数据类型_本地
char *time_str; // 时间字符串
int main(){
time_cnt = time(NULL); // 获取当前系统时间
printf("时间戳%lld\n",time_cnt);
printf("\n");
time_date = *gmtime(&time_cnt); // 转换为日期格式
printf("%d年",time_date.tm_year + 1900);
printf("%d月",time_date.tm_mon + 1);
printf("%d日\n",time_date.tm_mday);
printf("%d:",time_date.tm_hour + 8); // 北京时间需加8小时偏移
printf("%d:",time_date.tm_min);
printf("%d",time_date.tm_sec);
printf(" 星期%d\n",time_date.tm_wday);
printf("\n");
time_date_local = *localtime(&time_cnt); // 转换为日期格式
printf("%d年",time_date_local.tm_year + 1900);
printf("%d月",time_date_local.tm_mon + 1);
printf("%d日\n",time_date_local.tm_mday);
printf("%d:",time_date_local.tm_hour); // localtime会根据本地时区自动偏移
printf("%d:",time_date_local.tm_min);
printf("%d",time_date_local.tm_sec);
printf(" 星期%d\n",time_date_local.tm_wday);
printf("\n");
time_cnt_mk = mktime(&time_date_local); // 日期时间转unix时间戳
printf("本地日期时间转unix时间戳%lld\n",time_cnt_mk);
time_str = ctime(&time_cnt); // 时间戳转换为字符串
printf(time_str);
printf("\n");
time_str = asctime(&time_date_local); // 日期时间类型转换为字符串(无自动偏移需使用本地日期时间)
printf(time_str);
printf("\n");
char t[50]; // 用于存储strftime函数转换来的数据
// 数组,最大长度,格式,日期时间结构体地址
strftime(t,50,"%H-%M-%S",&time_date_local); // 将日期时间类型以特定格式存于数组中
printf(t);
return 0;
}
结果内容显示如下:
size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr)函数,format表格:
补充
clock_t clock(void);
该函数返回自程序启动起,处理器时钟所使用的时间。如果失败,则返回 -1 值。
用法示例:
#include <time.h>
#include <stdio.h>
int main()
{
clock_t start_t, end_t;
double total_t;
int i;
start_t = clock();
printf("程序启动,start_t = %ld\n", start_t);
printf("开始一个大循环,start_t = %ld\n", start_t);
for(i=0; i< 10000000; i++)
{
}
end_t = clock();
printf("大循环结束,end_t = %ld\n", end_t);
total_t = (double)(end_t - start_t) / CLOCKS_PER_SEC;
printf("CPU 占用的总时间:%f\n", total_t );
printf("程序退出...\n");
return(0);
}
double difftime(time_t time1, time_t time2);
返回 time1 和 time2 之间相差的秒数 (time1 - time2)
用法示例如下:
#include <stdio.h>
#include <time.h>
#ifdef _WIN32
#include <Windows.h>
#else
#include <unistd.h>
#endif
int main ()
{
time_t start_t, end_t;
double diff_t;
printf("程序启动...\n");
time(&start_t);
printf("休眠 5 秒...\n");
sleep(5);
time(&end_t);
diff_t = difftime(end_t, start_t);
printf("执行时间 = %f\n", diff_t);
printf("程序退出...\n");
return(0);
}