使用SimpleDateFormat转字符串为日期返回异常日期的问题排查
排查日期异常&简便转换方案
嘿,这个问题确实挺让人费解的——明明调试确认了源头日期是对的,传进方法就变成完全不相关的20171206,太诡异了!我来帮你拆解下可能的原因,再给你个省心的转换实现方式。
先排查异常日期的来源
首先得搞清楚这个20171206是从哪冒出来的,你可以按这几步查:
- 确认转换后的中间值:在把日期传给
.withStartDate()和.withEndDate()之前,立刻打印或者调试查看转换后的字符串(比如20180620),看看是不是转换环节就出问题了?比如有没有用错格式化模式,或者转换时不小心用了旧的日期对象? - 检查变量是否被篡改:会不会是你用来存转换后日期的变量,在转换完成到传入方法之间,被其他代码重新赋值了?比如全局变量、循环复用的变量,或者其他线程修改了值?
- 查看目标方法的内部逻辑:
.withStartDate()和.withEndDate()会不会有自己的日期解析逻辑?比如如果传入的字符串格式不符合它们的预期,就自动 fallback 到某个默认日期(比如20171206)?你可以 debug 进去看参数是怎么被处理的,或者查看方法源码。
简便的日期转换实现
假设你用的是Java(从GMT日期格式和方法调用风格来看大概率是),推荐用Java 8+的DateTimeFormatter来做转换,简单又不容易出错:
import java.time.LocalDate; import java.time.format.DateTimeFormatter; // 定义输入和输出的格式 DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyyMMdd"); // 从方法获取的原始日期字符串 String[] dateResults = getLastSupplierFlightResults(); String rawStartDate = dateResults[0]; String rawEndDate = dateResults[1]; // 转换格式 String formattedStart = LocalDate.parse(rawStartDate, inputFormatter).format(outputFormatter); String formattedEnd = LocalDate.parse(rawEndDate, inputFormatter).format(outputFormatter); // 传入目标方法 yourObject.withStartDate(formattedStart).withEndDate(formattedEnd);
如果是Java 7及以下版本,用SimpleDateFormat也能实现(注意线程安全问题,最好不要全局复用实例):
import java.text.SimpleDateFormat; import java.util.Date; SimpleDateFormat inputSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat outputSdf = new SimpleDateFormat("yyyyMMdd"); Date startDate = inputSdf.parse(rawStartDate); String formattedStart = outputSdf.format(startDate); // 同理处理结束日期
按这个方式转换,只要原始日期字符串是正确的,就能得到你要的yyyyMMdd格式。如果转换后的值是对的,但传入方法后还是变了,那大概率是方法内部的逻辑问题或者变量被篡改了,按前面的排查步骤走就能找到原因。
内容的提问来源于stack exchange,提问作者Steerpike
相关产品推荐
相关产品推荐

