背景:公司每月提供一个大的考勤 表,需要员工自己将打卡时间按照模板规范填入另外 一个文档中,一直都是复制,粘贴且效率极慢,就想做一个代码批量处理
(一天只需要打上班卡和下班卡,有时加班,怕下班忘记打卡,就在下班时间点先打一个卡,真正下班再打一个卡,这样就导致一天有多个卡点)
思路:
1、以日期为hashMap的key值,打卡时间为value值放到map里
2、小于12点为上班卡点取最小的值,大于12点为下班卡点取最大的值
问题:
输出结果:2020/4/1 的卡点为空,其它时间点都有的,当时把这个代码也给同事用了,他的4月1号卡点也没有,我们就在想当天为什么没有打卡,是不是当天有放假(对自己的代码太自信了[尴尬]),在其他的同事帮助下才发现当天有打卡,
1)发现问题解决问题是一贯作风,一步一步调试,发现 2020/4/1是有入到hashMap里面,但就是读不出来,自己也验证过,没有空格,文本完全一样,
2)后来发现 2020/4/1 的2020 前面有个占位符,不是空格,就是单纯的占位符,
3)用replaceAll("^\\s", ""); 也去不掉前面的占位符
原因:
那个空的占位符到底是什么?
1)可以将读取的到文本转换为字节 line.getBytes()
2)将读取的文本用notepad打开,以16进制查看
对应关系:
2020/4/1 8:28:41 | ef bb bf 32 30 32 30 2f 34 2f 31 20 38 3a 32 38 3a 34 31 0a |
2020/4/1 17:36:33 | 32 30 32 30 2f 34 2f 31 20 31 37 3a 33 36 3a 33 33 0a |
由此可以第一行相较第二行里面多了ef bb bf 这个是表示文本的编码格式,也就是我们所说的【魔数】,可以了解 下class类的魔数。
解决:
用subString作文本截取了 line.substring(line.indexOf("2"),line.length());就解决了不知道还有没有更高效的方法,