1、将一个8位长度的时间字符串(如:“20180409”)存入一个长度为3的byte数组中
2、从这个3个长度的byte数组总读取时间并还原成8位长度的时间字符串
用位运算就行了。3个字节,24位。5位来存日,2的5次方=32,存日可以了;同理,用4位来存月,剩下的15位来存年。刚开始把日期截成年、月、日,分别转成整型,然后申请3个字节的内存,再用位移和or操作就可以了
######最大23位就可以存下....
9999-12-31 :
10011100001111 1100 11111
System.out.println(Integer.toBinaryString(2018));//11111100010
System.out.println(Integer.toBinaryString(4));//100
System.out.println(Integer.toBinaryString(9));//1001
存的时候你就位移和逻辑运算就行了.
######可否限制时间字符串中的年份在 [1782-2127] ? 若可以的话,byte数组的三个元素分别代表:年份、月份、和日, 只是年份以2000为准,用正负表示:比如,用 -10 表示 1990。
######简单的写了一下,参见:
https://blog.xdemo.cn/java-8date-story-3bytes/
######看了大神给的思路,给弄出来了,感谢大神
存值:
public byte[] StringToByte(String date) {
int i, year, month, day;
year = Integer.parseInt(date.substring(0, 4));
year = year << 9;
month = Integer.parseInt(date.substring(4, 6));
month = month << 5;
day = Integer.parseInt(date.substring(6));
i = year | month | day;
byte[] data = new byte[3];
data[2] = (byte) (i & 0xFF);
data[1] = (byte) ((i >> 8) & 0xFF);
data[0] = (byte) ((i >> 16) & 0xFF);
return data;
}
取值:
public String ByteToString(byte[] data) {
int year, month, day;
day = data[2] & 0x1F;
month = (((data[1] << 3) & 0xF) | ((data[2] >> 5) & 0x7)) & 0xF;
year = (data[0] << 7) | ((data[1] >> 1) & 0x7F);
String date = new String(Integer.toString(year));
date.concat(Integer.toString(day));
if (month < 10) {
date = date.concat("0").concat(Integer.toString(month));
} else {
date = date.concat(Integer.toString(month));
}
if (day < 10) {
date = date.concat("0").concat(Integer.toString(day));
} else {
date = date.concat(Integer.toString(day));
}
return date;
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。