应用背景:
在MATLAB
与下位机仪器设备的RTC
(实时时钟模块)进行通信时,通信的数据传输形式为16进制,并且为了便于操作系统等对时间的调度和使用,采用epoch时间格式
进行代码开发便于对记时模块(RTC)等的移植和处理
。因此,如何在MATLAB中将当前时间转换为epoch时间格式。
Epoch简介
Epoch是固定在格林尼治时间,即UTC(Universal Time Coordinated)(GMT)
时区。同时,也代表从1970 01-01 00:00:00
开始的秒数。
目前大多数嵌入式处理器都是32位,以及大部分的UNIX系统也都是用32位元来记录时间,正值
表示1970年后,负值
表示1970年以前。可以很快的计算出时间领域。
例如:
2^31/86400(s) = 24855.13481(天) ~ 68.0958(年)
1970+68.0958 = 2038.0958
1970-68.0958 = 1901.9042
时间领域为[1901.9042,2038.0958]
解决方案:
Matlab提供了一系列关于时间处理的函数,针对该问题思路是将当前时间与epoch的初始时间做差,将日期差乘以86400(一天的秒数)得出前天epoch时间。Matlab貌似没有直接提供实现转换为epoch时间格式的函数,通过以下函数简介实现该功能求解。
Datetime()
函数:获取当前时间点(可指定时区、灵活的输入输出显示格式)如2022-07-31 11:00:00.
Datenum()
函数:将日期和时间转换为日期序列值。其中日期序列值表示某个固定的预设日期(0000年1月0日)以来的整个天数及其小数值。
`Datestr()函数:将对应的日期转换为字符串格式,满足datenum函数对于需转换时间的格式要求。
实现逻辑
实现逻辑是将获取当前时间的序列值
,以及epoch初始时的日期序列值
,然后将两者进行相减
,将获得的日期值乘以一天的秒数(86400)即可以获得对应的epoch时间格式。
实现代码如下
%设置命令输出窗口显示格式
format long
%获取当前时间
t=datetime("now")
%将当前时间转换字符形式
d= datenum(t)
t=datestr(t)
InputDate=datenum(t,'dd-mmm-yyyy HH:MM:SS')
% 验证输入时间序列值InputDate转换为年月日依旧正确
% e = datetime(InputDate,'ConvertFrom','datenum')
UnixOrigin=datenum('1970-01-01 00:00:00','yyyy-mm-dd HH:MM:SS')
% 验证日期序列值UnixOrigin转换为日期时间依旧正确
% f = datetime(UnixOrigin,'ConvertFrom','datenum')
EpochSecond=round((InputDate-UnixOrigin)*86400)
总结
本次博文记录使用matlab将当前时间转换为epoch时间形式的思路和方法,记录和分享出来便于以后查看使用,也欢迎大家交流学习和指正。