起因很简单,读取TXT文件中的时间,转换为LocalDateTime格式。
public static void main(String[] args){
String path = "E:\\u02\\next_date_time.txt";
String s = FileUtil.readFile(path); // 20200601000000
String datetime = "20200601000000";
System.out.println(s); // 20200601000000
System.out.println(datetime); // 20200601000000
System.out.println(datetime.equals(s)); // ???
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
LocalDateTime ldt = LocalDateTime.parse(datetime, dtf);
System.out.println(ldt);
LocalDateTime time = LocalDateTime.parse(s, dtf);
System.out.println(time);
}
就是这么简单的一段代码,然而报错了,报的错是时间格式转换异常:
Exception in thread "main" java.time.format.DateTimeParseException: Text '20200601000000' could not be parsed at index 0
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
at java.time.LocalDateTime.parse(LocalDateTime.java:492)
at com.yunda.collect.common.util.FileUtil.main(FileUtil.java:103)
报错是在LocalDateTime time = LocalDateTime.parse(s, dtf);,所以一开始在没有把两个时间戳打印出来的时候,解决方向都是在这个字段串转日期这里,然而找了很久,看了很多方案,都不行。
后来,把两个时间戳都打印出来,肉眼看来,是一致的,但是还是会报错,就想,难道这两个字符串不相等?所以才有了equals这个输出,问题就来了!
可以发现,两个字符串一样的值竟然是false!
dateTime是我们定义的,s是我们读取TXT读出来的,那么问题只可能是在我们读取TXT的时候了。
问题定位到了, 然后困扰的还是两个一样的字符串怎么才会不相等!想到有可能是编码格式的问题。但是读取的时候编码格式是设置成utf-8的,最后在大佬的辅助下,用Debug模式,想到可以看到字符串的字节数组,终于发现了问题所在。
可以看到,在Debug模式下,s的字节数组多了一位。
没错,就是 \uFEFF,百度之后,发现这个是文本保存的时候包含了BOM(Byte Order Mark,字节顺序标记,出现在文本文件头部,Unicode编码标准中用于标识文件是采用哪种格式的编码)导致的。打开本地TXT,发现确实是UTF-8包含BOM。
解决办法就是用Sublime Text转换一下正常的UTF-8就好了。