码迷,mamicode.com
首页 > 其他好文 > 详细

浅析MCM时间格式

时间:2019-11-11 12:30:49      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:border   mss   空间   valueof   center   bind   告诉   转换   public   

最近在项目中,遇到时间格式的一种存储方式-MCM【小端,低字节低地址】。
一,何为MCM时间?
     MCM时间格式为节省卡内存储空间而生它可以表示2000年1月1日到2063年12月31日这段时间内任何一个时间。它总共由4个字节共32位二进制数组成,除年外【年只有后面的2位数,比如2019,只会存19】,月、日、时、分、秒分别按照其数据可能的最大值分配二进制位数,具体格式为:

MCM时间格式
时间名称 位数 位置
6 31b-26b
4 25b-22b
5 21b-17b
5 16b-12b
6 11b-6b
6 5b-0b

比如,收到的原始报文0x79D96D19,转成2进制之后0111 1001 1101 1001 0110 1101 0001 1001?,下划线对应着年,2进制011110对应着10进制30,再拼接"20",得到年份2030。依次类推

最终得到的时间就是2030年7月12日22时52分25秒。

二,具体的代码实现

 1 /**
 2      * 
 3      * 功能:把MCM格式的时间转换成yyyyMMddHHmmss格式的String
 4      */
 5     public static String MCMToDateString(String MCMDate) {
 6         String binDate=StringUtils.leftPad(Integer.toBinaryString(Integer.valueOf(MCMDate,16)),32,"0");
 7         String year="20"+StringUtils.leftPad(Integer.valueOf(binDate.substring(0, 6),2)+"",2,"0");
 8         String month=StringUtils.leftPad(Integer.valueOf(binDate.substring(6, 10),2)+"",2,"0");
 9         String day=StringUtils.leftPad(Integer.valueOf(binDate.substring(10, 15),2)+"",2,"0");
10         String hour=StringUtils.leftPad(Integer.valueOf(binDate.substring(15, 20),2)+"",2,"0");
11         String minute=StringUtils.leftPad(Integer.valueOf(binDate.substring(20, 26),2)+"",2,"0");
12         String sec=StringUtils.leftPad(Integer.valueOf(binDate.substring(26, 32),2)+"",2,"0");
13         String realDate=year+month+day+hour+minute+sec;
14         return realDate;
15     }

1.Integer.valueOf(MCMDate,16),告诉jvm这个是16进制字符串

2.Integer.toBinaryString(),这是将16进制转成2进制,负数会用补码表示。转换时,前面会修丢0.

3.StringUtils.leftPad(str,32,"0"),不足32位时,左填充0。

浅析MCM时间格式

标签:border   mss   空间   valueof   center   bind   告诉   转换   public   

原文地址:https://www.cnblogs.com/zhi-yi/p/11833967.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!