【江协科技STM32】Unix时间戳BKP备份寄存器RTC实时时钟(学习笔记)
Unix时间戳
- Unix 时间戳(Unix Timestamp)定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数,不考虑闰秒
- 时间戳存储在一个秒计数器中,秒计数器为32位/64位的整型变量
- 世界上所有时区的秒计数器相同,不同时区通过添加偏移来得到当地时间
(北京时间)推荐时间戳换算工具:时间戳(Unix timestamp)转换工具 - 在线工具
Unix 时间戳的优缺点
Unix 时间戳的优点主要有:其一,简单统一,全球通用,方便不同系统和地区间进行时间数据交互与处理,在分布式系统中优势明显。其二,存储和计算高效,以一个整数表示时间,在存储上占用空间小,计算时间差值等操作简单直接,利于提升程序性能。其三,便于排序,由于是数值型,按时间顺序排列时,数值大小顺序就对应时间先后顺序。
然而,它也存在一些缺点:一方面,可读性差,Unix 时间戳是一个数值,对于人来说,很难直观理解其代表的具体时间,需要转换为人类可读的日期时间格式。另一方面,存在溢出风险,随着时间推移,32 位系统下表示时间戳的整数可能会达到上限,导致溢出问题,不过 64 位系统大大延长了可表示的时间范围。此外,它依赖于特定的起始时间,若系统时间计算或起始时间设置有误,可能导致时间数据错误。
一些不用我们担心
框图说明我们这款STM32,时间戳是32位的数据类型,32位的时间戳,表示我们这款STM32芯片也会在2038年出现BUG吗?实际上并不会,根据up猪的研究,这个时间戳在STM32程序中定义的是无符号的32位。 无符号 32 位意味着它使用 32 个二进制位来表示数据,且这 32 位全部用于表示数值大小,不用于表示正负。其表示的范围是从 0 到 2 的 32 次方减 1 。具体计算为 2³² - 1 = 4294967295 。也就是说,无符号 32 位能够表示的最大值是 4294967295,最小值是 0。计算一下要到2106年才会溢出。
UTC/GMT
- UTC(协调世界时)和 GMT(格林威治标准时间)都与时间计量有关。
- GMT 是指位于英国伦敦郊区的皇家格林威治天文台的标准时间,它以地球自转为基础,是一种天然的时间计量系统。但由于地球自转并不均匀,GMT 在时间计量上存在一定局限性。
- UTC(Universal Time Coordinated)协调世界时是一种以原子钟为基础的时间计量系统。它规定铯133原子基态的两个超精细能级间在零磁场下跃迁辐射9,192,631,770周所持续的时间为1秒。当原子钟计时一天的时间与地球自转一周的时间相差超过0.9秒时,UTC会执行闰秒来保证其计时与地球自转的协调一致
- UTC 是一种更精准、更科学的时间计量系统。它以原子时为基础,通过闰秒的方式与地球自转时间保持协调。UTC 在全球范围内广泛应用,是互联网、航空、航海等众多领域的标准时间。比如在国际航班的时刻表制定中,就普遍采用 UTC 时间。
- 虽然在日常生活中,两者常被混用,但严格来说,UTC 是更现代、更精确的时间标准,而 GMT 是基于天文观测的传统时间标准。
为什么会有闰秒现象?
戳一下了解
闰秒现象的出现,主要是由地球自转的不稳定性与原子时的高度精确性之间的矛盾所导致的。
一、根本原因:两种时间标准的差异
- 太阳时(基于地球自转)
地球自转一周的时间被定义为一天,但实际上地球的自转速度并非恒定不变。
- 变慢因素:月球和太阳的潮汐力、地球内部的物质运动等,使得地球每天的时长大约会增加1.7 毫秒。
- 不规则性:地震、气候变化等情况,可能会让地球的自转速度突然加快或减慢。
- 原子时(基于原子振动)
原子时(例如 UTC 的基础 TAI)以铯原子的振动频率为基准,其精度极高,达到了每 100 万年误差不超过 1 秒,是一种均匀流逝的时间标准。
二、闰秒的作用:协调两种时间
为了防止太阳时(反映昼夜交替)和原子时(用于科学计量)之间的差距不断扩大,国际计量局(BIPM)下属的国际地球自转服务组织(IERS)会通过添加或删除闰秒的方式,让 UTC 与太阳时(UT1)的差距保持在**±0.9 秒**以内。
- 具体操作:当 UTC 比 UT1 快时,在 6 月 30 日或 12 月 31 日的最后一秒增加一个正闰秒(如 23:59:60);如果地球自转意外加快,UTC 可能会比 UT1 慢,此时则需要添加负闰秒(不过自 1972 年以来尚未出现过这种情况)。
三、闰秒的历史与现状
- 起源:1972 年,国际电信联盟正式引入闰秒机制,以此取代此前的 GMT。
- 实施情况:截至 2023 年,一共添加了27 次闰秒,最近一次是在 2016 年 12 月 31 日。
- 争议:由于闰秒会对全球的计算机系统、卫星导航等造成影响,国际上对于是否取消闰秒存在争议。目前的计划是在 2035 年左右逐步废除闰秒,但这一方案需要各国达成一致。
四、闰秒的影响
- 积极方面:保证了天文时间(如日出日落)与民用时间的同步,对航空、航天、天文观测等领域至关重要。
- 挑战:
- 计算机系统需要调整时间,这可能会导致服务中断(例如 2012 年闰秒曾引发 Linux 系统大规模故障)。
- 高频交易、卫星定位等对时间精度要求极高的场景,需要应对时间跳跃问题。
总结
闰秒是人类在自然时间(地球自转)和人工时间(原子钟)之间寻求平衡的一种妥协方案。随着技术的不断发展,未来或许会出现新的时间标准来替代闰秒,但目前它仍然是维持时间体系稳定的关键因素。
时间戳转换
C语言的time.h模块提供了时间获取和时间戳转换的相关函数,可以方便地进行秒计数器、日期时间和字符串之间的转换
| 函数 | 作用 |
| time_t time(time_t*); | 获取系统时钟 |
| struct tm* gmtime(const time_t*); | 秒计数器转换为日期时间(格林尼治时间) |
| struct tm* localtime(const time_t*); | 秒计数器转换为日期时间(当地时间) |
| time_t mktime(struct tm*); | 日期时间转换为秒计数器(当地时间) |
| char* ctime(const time_t*); | 秒计数器转换为字符串(默认格式) |
| char* asctime(const struct tm*); | 日期时间转换为字符串(默认格式) |
| size_t strftime(char*, size_t, const char*, const struct tm*); | 日期时间转换为字符串(自定义格式) |
自学菜鸟教程,有上面各个函数的讲解:C 标准库 – <time.h> | 菜鸟教程
获取系统时钟
#include <stdio.h>
#include <time.h>time_t ime_cnt; //秒计数器数据类型,,64位秒计数器,不用担心计数溢出 int main()
{ime_cnt = time(NULL);printf("%d\n",ime_cnt);return 0;
}
运行得到时间戳的秒数,复制到时间戳换算工具可以知道当前时间
通过输出参数获取:现象跟上面一样
#include <stdio.h>
#include <time.h>time_t ime_cnt; //秒计数器数据类型int main()
{//ime_cnt = time(NULL);time(&ime_cnt);printf("%d\n",ime_cnt);return 0;
}
秒计数器转换为日期时间(格林尼治时间)
#include <stdio.h>
#include <time.h>struct tm time_data; //日期时间数据类型int main()
{ime_cnt = 1672588795; time_data = *gmtime(&ime_cnt);printf("%d\n",time_data.tm_year+1900);printf("%d\n",time_data.tm_mon+1);printf("%d\n",time_data.tm_mday);printf("%d\n",time_data.tm_hour);printf("%d\n",time_data.tm_min);printf("%d\n",time_data.tm_sec);printf("%d\n",time_data.tm_wday);return 0;
}
运行结果时间跟PPT伦敦时间一样
秒计数器转换为日期时间(当地时间)
这个函数和上一个函数一样,此函数会根据时区的偏移自动增加小时的偏移,在程序中改一下函数名即可,函数内部会根据当前电脑设置,自动判断我们在哪个时区,然后把时间添加时区偏移后输出出来

日期时间转换为秒计数器(当地时间)
上面函数的逆过程,需要传输的是当地时间,不能是伦敦时间
#include <stdio.h>
#include <time.h>time_t time_cnt; //秒计数器数据类型,64位秒计数器,不用担心计数溢出
struct tm time_data; //日期时间数据类型int main()
{time_cnt = 1672588795; time_data = *localtime(&time_cnt);printf("%d\n",time_data.tm_year+1900);printf("%d\n",time_data.tm_mon+1);printf("%d\n",time_data.tm_mday);printf("%d\n",time_data.tm_hour);printf("%d\n",time_data.tm_min);printf("%d\n",time_data.tm_sec);printf("%d\n",time_data.tm_wday);time_cnt = mktime(&time_data); //返回对应秒计数器值printf("%d\n",time_cnt);return 0;
}
秒数和最初一样

相关文章:
【江协科技STM32】Unix时间戳BKP备份寄存器RTC实时时钟(学习笔记)
Unix时间戳 Unix 时间戳(Unix Timestamp)定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数,不考虑闰秒时间戳存储在一个秒计数器中,秒计数器为32位/64位的整型变量世界上所有时区的秒计数器相同,不同时区通过…...
PCDN网络设备
PCDN(Peer-to-Peer Content Delivery Network,点对点内容分发网络)是一种基于P2P技术的内容分发网络。它利用用户终端设备之间的直接数据传输来减少中心服务器的压力,并提高内容交付的速度和效率。 PCDN的工作原理 节点共享&…...
3.17-3.23 Web3 游戏周报:Pixudi 双榜领跑,The Forgotten Runiverse 登陆三大主机平台
回顾上周的区块链游戏概况,查看 Footprint Analytics 与 ABGA 最新发布的数据报告。 【3.17–3.23】Web3 游戏行业动态 Ronin 将与 Alpha Growth 等合作推出 1300 万美元增长计划,以向 DeFi 扩张Notcoin 开发工作室 Open Builders 宣布推出 Not Games …...
AppInventor2生成3位数的水仙花数
生成3位水仙花数(每位数字的立方之和刚好等于这个数字)的代码,如下: 来源:【生成Python】AppInventor2中文网已支持代码块转换Python源码! - App Inventor 2 中文网 - 清泛IT社区,为创新赋能&…...
【聚类算法解析系列02】经典聚类算法(上)——K-Means与层次聚类
【聚类算法解析系列02】经典聚类算法(上)——K-Means与层次聚类 引言:算法背后的认知革命 K-Means与层次聚类,这两个诞生于1960年代的算法,至今仍是工业界使用率最高的聚类工具。它们分别代表了两种根本性的世界观&am…...
shadcn如何给dialog增加关闭按钮和隐藏右上角关闭按钮
增加关闭按钮: <DialogFooter><DialogClose asChild><button className"rounded-sm bg-black/100 px-3 py-2 text-xs font-semibold text-white shadow-xs hover:bg-black/90" >Close</button></DialogClose> </DialogF…...
华为机试牛客刷题之HJ59 找出字符串中第一个只出现一次的字符
HJ59 找出字符串中第一个只出现一次的字符 描述 对于给定的字符串,找出第一个只出现一次的字符。如果不存在,则输出 −1。 输入描述: 在一行上输入一个长度为 1≦len(s)≦10^3 、仅由小写字母构成的字符串 s。 输出描述: 如果存…...
C# 中实现一个线程持续读取,另一个线程负责写入,且写入时读取线程暂停
实现思路 暂停信号:通过 ManualResetEventSlim 通知读取线程暂停。 暂停确认:读取线程收到暂停信号后,发送确认信号。 原子性控制:确保写入操作执行期间,读取线程处于完全暂停状态。 恢复机制:写入完成后…...
[Effective C++]条款22:将成员变量声明为private
. 在C中,将成员变量声明为private而不是public,主要是为了遵循面向对象编程(OOP)的封装原则。他有助于隐藏对象的内部实现细节,提供更好地控制,安全性和可维护性。 1、数据隐藏与封装 将成员变量声明为pr…...
心法利器[132] | 大模型系统性能优化trick
心法利器 本栏目主要和大家一起讨论近期自己学习的心得和体会。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有。 2023年新的文章合集已经发布,获取方式看这里:又添十万字-CS的陋室2023年文章合集来袭,更…...
Android第六次面试总结(Java设计模式篇一)
单例模式属于创建型设计模式,它保证一个类仅有一个实例,并且提供一个全局访问点来获取该实例。下面为你详细阐述单例模式的好处和坏处。 好处 资源优化:单例模式能保证一个类只有一个实例,这对于那些创建和销毁开销大的对象&…...
stm第九天433M无线遥控灯
1.433M无线模块工作原理 数据发射模块的工作频率为315M,采用声表谐振器SAW稳频,频率稳定度极高,当环境温度在-25~85度之间变化时,频飘仅为3ppm.接收到信号,接收模块对应针脚输出高电平,有DO D1 D2 D3&#…...
六十天前端强化训练之第三十天之深入解析Vue3电商项目:TechStore全栈实践(文结尾附有源代码)
欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗,谢谢大佬! 目录 深入解析Vue3电商项目:TechStore全栈实践 一、项目架构设计 二、核心功能实现 三、组合式API深度实践 四、性能优化实践 五、项目扩展方向 六、开发经验总结…...
类与对象(中)(详解)
【本节目标】 1. 类的6个默认成员函数 2. 构造函数 3. 析构函数 4. 拷贝构造函数 5. 赋值运算符重载 6. const成员函数 7. 取地址及const取地址操作符重载 1.类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗&…...
Spring Boot框架中常用注解
以下是Spring Boot框架中常用注解的详细说明,包括名称、用途、用法、使用位置及扩展示例,按功能模块分类整理: 一、核心启动与配置注解 1. SpringBootApplication 用途:主启动类注解,整合了 Configuration、EnableAu…...
ResNet与注意力机制:深度学习中的强强联合
引言 在深度学习领域,卷积神经网络(CNN)一直是图像处理任务的主流架构。然而,随着网络深度的增加,梯度消失和梯度爆炸问题逐渐显现,限制了网络的性能。为了解决这一问题,ResNet(残差…...
notify_one() 会阻塞吗?
notify_one() 不会阻塞。它是用于唤醒一个等待中的线程,通常是通过条件变量(std::condition_variable)来使用的。调用 notify_one() 会使一个处于等待状态的线程被唤醒并继续执行,但它本身并不会阻塞。 当调用 notify_one() 时&a…...
Flutter项目之页面实现以及路由fluro
目录: 1、项目代码结构2、页面编写以及路由配置main.dart(入口文件)page_content.dartindex.dartapplication.dartpubspec.yamllogin.dartdio_http.dart 3、Fluro路由routes.dartnot_found_page.dart(路由优化,找不到页面时展示此页面) 4、注册页面 1、项…...
《Python实战进阶》第31集:特征工程:特征选择与降维技术
第31集:特征工程:特征选择与降维技术 摘要 特征工程是机器学习和数据科学中不可或缺的一环,其核心目标是通过选择重要特征和降低维度来提升模型性能并减少计算复杂度。本集聚焦于特征选择与降维技术,涵盖过滤法、包裹法、嵌入法等…...
大模型在支气管哮喘手术全流程风险预测与治疗方案制定中的应用研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目标与方法 1.3 研究创新点 二、支气管哮喘概述 2.1 定义与发病机制 2.2 分类与临床表现 2.3 诊断标准与方法 三、大模型技术原理与应用现状 3.1 大模型的基本原理 3.2 在医疗领域的应用案例分析 3.3 适用于支气管哮喘预…...
C++类与对象的第二个简单的实战练习-3.24笔记
哔哩哔哩C面向对象高级语言程序设计教程(118集全) 实战二 Cube.h #pragma once class Cube { private:double length;double width;double height; public:double area(void);double Volume(void);//bool judgement(double L1, double W1, double H1);…...
react自定义hook
自定义hook: 用来封装复用的逻辑,,自定义hook是以use开头的普通函数,,将组件中可复用的状态逻辑抽取到自定义的hook中,简化组件代码 常见自定义hook例子: 封装一个简单的计数器 import {useS…...
Rk3568驱动开发_设备树点亮LED_10
设备树中添加节点 在设备树文件中添加led节点,添加完后需要重新编译内核,因为单独编译这个设备树文件生成的dtb文件目前不能直接做替换,所以要编译内核将编译好的boot.img文件烧录到设备里,boot.img里包含新添加的设备树节点&…...
大数据学习(82)-数仓详解
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一…...
Unity学习之Shader(Phong与Blinn-Phong)
三、Lesson3 1、关键名称 向量 • nDir:法线方向,点乘操作时简称n; • lDir:光照方向,点乘操作时简称l; • vDir:观察方向,点乘操作时简称v; • rDir:光反…...
uniapp笔记-swiper组件实现轮播图
思路 主要就是参考 swiper | uni-app官网 实现轮播图。 实例 新建一个banner.vue通用组件。 代码如下: <template><view>轮播图</view> </template><script> </script><style> </style> 随后在index.vue中导…...
【C++ 继承】—— 青花分水、和而不同,继承中的“明明德”与“止于至善”
欢迎来到ZyyOvO的博客✨,一个关于探索技术的角落,记录学习的点滴📖,分享实用的技巧🛠️,偶尔还有一些奇思妙想💡 本文由ZyyOvO原创✍️,感谢支持❤️!请尊重原创…...
FPGA_YOLO(二)
上述对cnn卷积神经网络进行介绍,接下来对YOLO进行总结,并研究下怎么在FPGA怎么实现的方案。 对于一个7*7*30的输出 拥有49个cell 每一个cell都有两个bbox两个框,并且两个框所包含的信息拥有30个 4个坐标信息和一个置信度5个,剩下就是20个类别。 FPGA关于YOLO的部署 1…...
蓝桥杯学习-14子集枚举,二进制枚举
子集枚举 一、回溯3-子集枚举(递归实现指数型枚举) 一旦涉及选与不选,删和不删,留和不留-->两种状态-->就要想到子集枚举例题1–递归实现指数型枚举19685 其实看不懂这个题目,好奇怪的题目。根据老师的解析来写…...
人工智能时代大学教育范式重构:基于AI编程思维的能力培养路径研究
人工智能技术的快速发展正在重塑高等教育的内容与方法。本文以AI编程教育为切入点,通过文献分析与案例研究,探讨AI时代大学教育的核心能力需求与教学范式转型路径。研究发现,AI编程中蕴含的系统性思维训练、项目架构能力和元认知能力培养机制…...
