DateTimeFormatter转换时间引发的一起格式血案

起因很简单,读取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这个输出,问题就来了!
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就好了。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值