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.mzph.cn/news/632110.shtml

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

相关文章

内网穿透的应用-使用Docker搭建一个Wiki.Js知识库系统并实现分享他人远程创作

文章目录 1. 安装Docker2. 获取Wiki.js镜像3. 本地服务器打开Wiki.js并添加知识库内容4. 实现公网访问Wiki.js5. 固定Wiki.js公网地址 不管是在企业中还是在自己的个人知识整理上&#xff0c;我们都需要通过某种方式来有条理的组织相应的知识架构&#xff0c;那么一个好的知识整…

KNN算法原理及应用

理解KNN 算法原理 KNN是监督学习分类算法&#xff0c;主要解决现实生活中分类问题。 根据目标的不同将监督学习任务分为了分类学习及回归预测问题。 监督学习任务的基本流程和架构&#xff1a; &#xff08;1&#xff09;首先准备数据&#xff0c;可以是视频、音频、文本、…

【C++】STL 算法 - 累加填充算法 ( 元素累加算法 - accumulate 函数 | 元素填充算法 - fill 函数 )

文章目录 一、元素累加算法 - accumulate 函数1、函数原型分析2、代码示例 二、元素填充算法 - fill 函数1、函数原型分析2、代码示例 一、元素累加算法 - accumulate 函数 1、函数原型分析 在 C 语言 的 标准模板库 ( STL , STL Standard Template Library ) 中 , 提供了 accu…

晶格动力学 GULP 软件的安装步骤

---------------------------------------------------------------------- GULP软件现已发展到5.2版本&#xff0c;其使用Fortran编译器&#xff0c;可运行在Linux/Unix系统下&#xff0c;但不提供任何Windows版本的技术支持。 下载网址&#xff1a; http://gulp.curtin.ed…

flink 最后一个窗口一直没有新数据,窗口不关闭问题

flink 最后一个窗口一直没有新数据&#xff0c;窗口不关闭问题 自定义实现 WatermarkStrategy接口 自定义实现 WatermarkStrategy接口 窗口类型&#xff1a;滚动窗口 代码&#xff1a; public static class WatermarkDemoFunction implements WatermarkStrategy<JSONObject…

10种较流行的网络安全框架及特点分析

网络安全框架主要包括安全控制框架&#xff08;SCF&#xff09;、安全管理框架&#xff08;SMP&#xff09;和安全治理框架&#xff08;SGF&#xff09;等类型。对于那些希望按照行业最佳实践来开展网络安全能力建设的企业来说&#xff0c;理解并实施强大的网络安全框架至关重要…

Demystifying CXL Memory with Genuine CXL-Ready Systems and Devices——论文阅读

MICRO 2023 Paper CXL论文阅读汇总 问题 对更大容量和更高带宽的内存的不断增长的需求推动了基于Compute eXpress Link&#xff08;CXL&#xff09;的内存扩展和分离技术的创新。特别是&#xff0c;基于CXL的内存扩展技术不仅能够经济地扩展内存容量和带宽&#xff0c;还能够…

【数据结构】二叉树(遍历,递归)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​​ 目录 二叉树遍历规则 前序遍历 ​…

flutter 客户端日志上传定位错误信息

背景 flutter 开发的app 安装到真机上 无法定位报错信息&#xff0c;只能使用usb连接电脑 使用adb logcat来查看日志效率低下。 想法 如果将flutter 开发的app 运行的时候 将日志写进一个日志文件里面去&#xff0c;然后给flutter app搭建一个http服务器&#xff0c;后端知道对…

如何使用VNC实现Win系统远程桌面Ubuntu图形化界面【内网穿透】

文章目录 推荐前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安装VNC viewer连接工具4. 内网穿透4.1 安装cpolar【支持使用一键脚本命令安装】4.2 创建隧道映射4.3 测试公网远程访问 5. 配置固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址5.3 …

vue:处理base64格式文件pdf、图片预览

一、需求&#xff1a;后端返回是base64数据&#xff0c;需要前端处理来展示文件。 二、实现方法&#xff1a; 解释一下这段代码的功能&#xff1a; &#xff09;preview(item) 是一个函数&#xff0c;接受一个参数 item&#xff0c;其中包含了文件的相关信息。 &#xff09;首…

HTML5+CSS3+JS小实例:实时给中文添加拼音

实例:实时给中文添加拼音 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"&…

使用freessl为网站获取https证书及配置详细步骤

文章目录 一、进入freessl网站二、修改域名解析记录三、创建证书四、配置证书五、服务启动 一、进入freessl网站 首先进入freessl网站&#xff0c;需要注册一个账号 freessl网站 进入网站后填写自己的域名 接下来要求进行DCV配置 二、修改域名解析记录 到域名管理处编辑域名…

智慧水务管理的发展历史有哪些阶段呢

随着科技的飞速发展&#xff0c;智慧水务管理已经成为了城市基础设施的重要组成部分。从传统的人工管理到现代的智能化管理&#xff0c;智慧水务经历了多个阶段的发展历程。本文将带您了解智慧水务管理的历史演变。 一、初级阶段&#xff1a;人工管理 在智慧水务管理发展的初期…

MS2358——96KHz、24bit 音频 ADC

产品简述 MS2358 是带有采样速率 8kHz-96kHz 的立体声音频模数 转换器&#xff0c;适合于面向消费者的专业音频系统。 MS2358 通过使用增强型双位 Δ - ∑ 技术来实现其高精度 的特点。 MS2358 支持单端的模拟输入&#xff0c;所以不需要外部器 件&#xff0c;非常适…

maven环境搭建(打包项目)

Maven:直观来讲就是打包写好的代码封装 Apahche 软件基金会&#xff08;非营业的组织&#xff0c;把一些开源软件维护管理起来&#xff09; maven apahce的一个开宇拿项目&#xff0c;是一个优秀的项目构建&#xff08;管理工具&#xff09; maven 管理项目的jar 以及jar与j…

[C++]:12:模拟实现list

[C]:12:模拟实现list 一.看一看SGI的stl_list的源码&#xff1a;1.基础结构构造函数1.节点结构&#xff1a;2.节点构造函数&#xff1a;3.链表结构&#xff1a;4.链表的构造函数&#xff1a; 2.析构1.节点析构&#xff1a;2.链表的析构&#xff1a; 3.迭代器 二.模拟实现list1.…

py的函数多返回值

前言:之前我们学过了py中函数&#xff0c;这一章我们来学习它的进阶版 目录 一.函数的多返回值 1.1关于函数的多返回值 1.2举例 二.函数多种传参方式 2.1关于多种传参方式 2.2关键字参数 2.2缺省参数 2.3不定长参数 2.4小结 三.匿名函数 3.1关于函数如何作为参数进行…

android 自定义八边形进度条

自定义八边形动画效果图如下 绘制步骤&#xff1a; 1.先绘制橙色底部八边形实心 2.黑色画笔绘制第二层&#xff0c;让最外层显示一条线条宽度即可 3.再用黄色画笔绘制黄色部分 4.使用渐变画笔根据当前进度绘制覆盖黄色部分 5.使用黑色画笔根据当前进度绘制刻度条 6.黑色画笔绘制…

使用Sqoop的并行处理:扩展数据传输

使用Sqoop的并行处理是在大数据环境中高效传输数据的关键。它可以显著减少数据传输的时间&#xff0c;并充分利用集群资源。本文将深入探讨Sqoop的并行处理能力&#xff0c;提供详细的示例代码&#xff0c;以帮助大家更全面地了解和应用这一技术。 Sqoop的并行处理 在开始介绍…