Unix时间戳

时间戳,相信很多相关专业的人,计算机软件电子等等都会听过。由于最早是由Unix系统使用所以又叫Unix时间戳。

Unix 时间戳(Unix Timestamp)定义为从UTC(世界协调时)/GMT(格林尼治时)的1970年1月1日0时0分0秒开始所经过的秒数不考虑闰秒,我们不需要考虑进位,只需要记录秒数

所以时间戳只需要比较大的一个计数器即可记录时间。

UTC/GMT介绍

GMT(Greenwich Mean Time)格林尼治标准时间是一种以地球自转为基础的时间计量系统。它将地球自转一周的时间间隔等分为24小时,以此确定计时标准。(伦敦标准时间)

注意:由于引力潮汐种各样的因素其实地球自转时间是不断变慢,导致时间基础不准确;

UTC(Universal Time Coordinated)协调世界时是一种以原子钟为基础的时间计量系统。它规定铯133原子基态的两个超精细能级间在零磁场下跃迁辐射9,192,631,770周所持续的时间为1秒。当原子钟计时一天的时间与地球自转一周的时间相差超过0.9秒时,UTC会执行闰秒来保证其计时与地球自转的协调一致。

注意:闰秒机制:由于地球受到潮汐,引力变化等等因素影响自转一周时间是不固定的,假设:时间会偏慢开始可能差1或者0.9秒才有24h,此时我们可以把UTC设置为2进1,来等待GMT时间减小误差,使得两个同步。

时间戳存储在一个秒计数器中,秒计数器为32位/64位的整型变量 世界上所有时区的秒计数器相同,不同时区通过添加偏移来得到当地时间。

优点:1简化硬件电路,.只需要一个比较大的寄存器存储秒数即可;

           2.计算差值方便,只需要计算两个时间戳之间的差值,不需要考虑单位转化;

 缺点:占用软件资源,时间戳往往比较大运算较为费时间;

时间戳的起点也就是:伦敦时间1970-1-1 0:0:0为起点开始计数秒数;

所以为我们之需要将时间戳进行转化,就可以很简单的计算出当前的时间;

那么具体的计算,就可以参考''time.h''里面如何计算。

对于我们使用时间戳而言主要:利用时间戳来实现时间的转换,具体的转换过程C语言当中已经完善在<time.h>当中我们只需要调用函数转换时间戳即可。

接下来主要是对于time.h的介绍,我截图来自菜鸟编程,自己感兴趣也可以去看看详细介绍

首先time当中封装好了变量:

以及分装好的库函数:

主要是针对于各种时间戳的函数,方便我们处理我这里演示几个常用的:

1.time_t time(time_t *seconds)可以用来获取当前时间戳,我们可以通过传递整数地址,也可以通过直接,接收返回值获取当前时间戳。

注意:该函数只适用于在线系统,我们可以获取电脑当中的时间戳,而对于离线系统例如后面STM32离线系统,它本身的计数器为空需要我们传递值,所以无法从中获取时间戳。

示例:

#include <stdio.h>
#include "time.h"
int main()
{time_t test_time = 0;//此处采用time.h当中定义的32位无符号整形,也可以自定义test_time = time(NULL);printf("时间戳test_time:%d\n", test_time);time_t test_time2 = 0;time(&test_time2);printf("时间戳test_time2:%d\n", test_time);return 0;
}

效果:

2.struct tm *gmtime(const time_t *timer):用于获取在GMT/UTC条件下我们对于时间戳的处理,返回的是tm的结构体:

struct tm {int tm_sec;         /* 秒,范围从 0 到 59                */int tm_min;         /* 分,范围从 0 到 59                */int tm_hour;        /* 小时,范围从 0 到 23                */int tm_mday;        /* 一月中的第几天,范围从 1 到 31                    */int tm_mon;         /* 月份,范围从 0 到 11                */int tm_year;        /* 自 1900 起的年数                */int tm_wday;        /* 一周中的第几天,范围从 0 到 6                */int tm_yday;        /* 一年中的第几天,范围从 0 到 365                    */int tm_isdst;       /* 夏令时                        */    
};

我们通过传递时间戳的地址,就可以返回tm结构体数据。

实例代码:

#include <stdio.h>
#include "time.h"time_t time_cnt;
struct tm time_data;
int main()
{/*time_cnt=time(NULL);*//*time(&time_cnt);*/time_cnt =1705582640;time_data= *gmtime(&time_cnt);printf("伦敦日期:%d-%d-%d\n",time_data.tm_year+1900, time_data.tm_mon + 1, time_data.tm_mday);printf("伦敦时间:%d:%d:%d\n", time_data.tm_hour, time_data.tm_min, time_data.tm_sec);return 0;
}

实际运行效果:

注意:我们需要注意这里面的年份,月份,小时,和时间戳定义的1970年1月1日0时0秒定义是不一样的,实际使用需要自己添加偏移。

其次获取到的是伦敦时间和日期,需要注意。

3.struct tm* localtime(const time_t*);就是在上面基础上增加了时区的偏移,不需要我们自己手动增加偏移,注意:是根据在线系统自己定位当前时区自己添加偏移,对于离线系统单片机而言实际效果和struct tm *gmtime(const time_t *timer)相同;

#include <stdio.h>
#include "time.h"time_t time_cnt;
struct tm time_data;
int main()
{/*time_cnt=time(NULL);*//*time(&time_cnt);*/time_cnt =1705582640;time_data= *localtime(&time_cnt);printf("北京日期:%d-%d-%d\n",time_data.tm_year+1900, time_data.tm_mon + 1, time_data.tm_mday);printf("北京时间:%d:%d:%d\n", time_data.tm_hour, time_data.tm_min, time_data.tm_sec);return 0;
}

运行效果:

4.time_t mktime(struct tm *timeptr),就是把tm结构体转化为时间戳秒数的函数。

我们可以通过传递时间日期结构体,来获取时间戳,一般我们用于RTC当中,定义日期的数组

然后获取时间戳,传递给单片机。用户更改时间,只需要照着更改日期时间结构体即可简单易懂。

示例代码:

#include <stdio.h>
#include "time.h"
struct tm time_data;
time_t time_cnt;
int main()
{time_data.tm_year = 2024 - 1900;time_data.tm_mon = 1 - 1;time_data.tm_mday = 4;time_data.tm_hour = 0;time_data.tm_min = 0;time_data.tm_sec = 1;time_data.tm_isdst = -1;time_cnt = mktime(&time_data);printf("时间戳:%d\n", time_cnt);return 0;
}

运行结果:

5.char* ctime(const time_t*);主要是把时间戳转化为字符串,方便打印函数直接打印。

6.char *asctime(const struct tm *timeptr) C 库函数 char *asctime(const struct tm *timeptr) 返回一个指向字符串的指针,它代表了结构 struct timeptr 的日期和时间。传回来的是一个日期时间的字符串指针。

实例代码:

#include <stdio.h>
#include <string.h>
#include <time.h>
int main()
{struct tm t;t.tm_sec = 50;t.tm_min = 02;t.tm_hour = 22;t.tm_mday = 18;t.tm_mon = 1-1;t.tm_year = 2024-1900;t.tm_wday = 4;puts(asctime(&t));return(0);
}

运行结果:

过多的函数不做讲解,具体可以参考time.h,可以通过定义或者看菜鸟教程C学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/413446.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java】SpringBoot快速整合Redis

什么是Redis&#xff1f; 文末有源码gitee地址 【面试】浅学Redis_redis 广播-CSDN博客 Redis是一种高性能开源的基于内存的&#xff0c;采用键值对存储的非关系型数据库&#xff0c;它支持多种数据结构&#xff0c;包括字符串、哈希表、列表、集合、有序集合等。Redis的特点之…

机器学习--Matplotlib

机器学习–Matplotlib Matplotlib 是专门用于开发2D图表(包括3D图表)以渐进、交互式方式实现数据可视化 简单的Matplotlib画图 — 以折线图为例 matplotlib.pyplot模块 matplotlib.pytplot包含了一系列类似于matlab的画图函数。 import matplotlib.pyplot as plt图形绘制流…

STM32入门教程-2023版【4-1】OLED调试工具

关注 点赞 不错过精彩内容 大家好&#xff0c;我是硬核王同学&#xff0c;最近在做免费的嵌入式知识分享&#xff0c;帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作! 一、概述 在这一节先提前介绍一下&#xff0c;在以后的教程中我们会经常用到这个显示屏&#xff0…

HCIA的访问控制列表ACL

ACL -----access control-list 允许/拒绝 ACL作用&#xff1a; 1.实现访问控制 2.定义感兴趣流量 ACL分类&#xff1a; 标准ACL 2000-2999&#xff08;只关注源IP地址&#xff0c;使用时应该尽量靠近目标&#xff09; 扩展ACL 3000-3999&#xff1a;写ACL不能写在源上&…

Java基础知识整理,注释、关键字、运算符

写在开头 万丈高楼平地起&#xff0c;要想学好汉语首先学拼音&#xff0c;想学好英语首先学26个字母&#xff0c;对于编程语言来说&#xff0c;一样的道理&#xff0c;要想学好必须先掌握其基础语法和知识&#xff0c;今天我们就来唠一唠Java语言中那些出现频率极高&#xff0…

Linux:shell脚本:基础使用(8)《函数局部|全局变量函数传入位置变量return》

基本的函数定义 把一些重复调用的命令写进一个函数里&#xff0c;下次直接调用函数名&#xff0c;这样的既方便修改&#xff0c;又可以让思路清晰 function 函数名(){ 当调用这个函数时候执行的命令...... } 这个是一个基础的函数定义&#xff0c;当然你不加function也是可以的…

Three.js Tri-panner (三面贴图) 材质 两种实现方式

文章目录 介绍自定义shaderNodeMaterial修复&#xff1a;骨骼材质特殊处理修复&#xff1a;使用法相贴图时整体变色 介绍 Tri-panner 在babylonjs中有支持 但是three.js目前的基础材质并不支持 需要自己定义shader 或者使用目前还没有什么完善的文档的 NodeMaterial 下面展示两…

C++ 之LeetCode刷题记录(十三)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅。 依旧是追求耗时0s的一天。 70. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可…

为什么使用双token实现无感刷新用户认证?

单token机制 认证机制&#xff1a;对与单token的认证机制在我们项目中仅使用一个Access Token的访问令牌进行用户身份认证和授权的方案处理。 不足之处&#xff1a; 安全性较低(因为只有一个token在客户端和服务器端之间进行传递&#xff0c;一目Acess Token被截获或者被泄露…

卷级实时备份功能特点及应用场景

为满足部分对RTO和RPO指标敏感的用户需求&#xff0c;云祺科技通过结合卷远程复制技术和持续数据保护技术、以及高可用技术的原理&#xff0c;推出了一款基于卷为最小处理单元的实时容灾备份产品&#xff0c;其对于备份源对象具有良好的兼容性&#xff0c;无论是文件、影音、应…

如何做好一个信息系统项目经理,一个项目经理的个人体会和经验总结(一)

前言 作为一个信息系统项目经理&#xff0c;最要紧的就是要明白什么是因地制宜、因势利导&#xff0c;只有最合适的&#xff0c;没有什么叫对的&#xff0c;什么叫错的&#xff1b;最忌讳的就是完美主义倾向&#xff0c;凡事都要寻找标准答案和最优答案&#xff0c;既耽误了项…

【欢迎您的到来】这里是开源库get_local_info作者的付费专栏

您好&#xff0c; 我是带剑书生&#xff0c;开源库get_local_info的作者&#xff0c;欢迎您的到来&#xff0c;这里是我的付费专栏&#xff0c;会用更简洁的语言&#xff0c;更通俗的话语&#xff0c;来帮助您更好的学习rust&#xff0c;这里不仅仅讲解Rust在某些应用功能实现上…