Unix时间戳与Time.h转换时间戳


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);
}
  • 22
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值