踩坑之Linux下DateFormat的parse方法解析异常
日常工作,公司安排要将原来跑在window环境的一个老项目迁移到Linux环境中,迁移完之后,便开始逐一测试项目的各个功能,保证其都可以正常使用。测试过程中终究还是发现了一个刚开始让我匪夷所思的现象,不过后来还是自己解决了,下面是我开始发现错误到解决问题的整个过程。一个录入商品的功能,有三个时间字段,分别录入不同的时间,点击保存,结果只有一个保存成功,另...
日常工作,公司安排要将原来跑在window环境的一个老项目迁移到Linux环境中,迁移完之后,便开始逐一测试项目的各个功能,保证其都可以正常使用。测试过程中终究还是发现了一个刚开始让我匪夷所思的现象,不过后来还是自己解决了,下面是我开始发现错误到解决问题的整个过程。
一个录入商品的功能,有三个时间字段,分别录入不同的时间,点击保存,结果只有一个保存成功,另外两个都不能保存。
返回到window环境进行测试,一切正常。ok,只能查看Linux环境下tomcat的输出日志了,通过命令 tail -f 日志名,打开日志,再次录入保存,日志打出错误如下图:
错误信息很简单,说是不能解析,window环境为何一切正常,Linux就解析报错呢?于是追查具体解析字符串为日期类型的方法,如下原始封装的方法代码:
public Date stringToDate(String dateStr) {
DateFormat df = DateFormat.getDateInstance();
Date date = null;
try {
date = df.parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
看着没有任何异常的一个方法,但是事实就是报错了在Linux,于是我聚焦到DateFormat的parse这个方法上,上网查找资料发现果然是Linux环境不支持这种日期解析转换的方式,至此问题找到。
下面就是具体的代码优化了,首先封装了一个支持在Linux环境解析字符串为日期的方法
public Date toDateLinux(String str){
Date date = new Date();
String[] parts = str.split("-");
if(parts.length >= 3){
int years = Integer.parseInt(parts[0]);
int months = Integer.parseInt(parts[1]) - 1;
int days = Integer.parseInt(parts[2]);
int hours = 0;
int minutes = 0;
int seconds = 0;
GregorianCalendar gc = new GregorianCalendar(years,months,
days,hours,minutes,seconds);
date = gc.getTime();
}
return date;
}
通过单元测试输出的日期和之前在window环境的原始方法解析得到的日期一致,所以此方法正确。
然后封装一个判断环境的方法,这里用到了System.getProperties().
/**
*判断是否是Linux环境的方法
* */
public static boolean isLinuxOS() {
Properties props = System.getProperties();
if (props.getProperty("os.name").toLowerCase().contains("linux")) {
return true;
}
return false;
}
最后通过判断是什么环境(window还是Linux)调用适合各自环境的转换日期方法
public Date formateDate(String dateStr) {
Date date = null;
//判断是否是Linux环境
if (PreScmData.isLinuxOS()){
//若是Linux环境,执行新封装的方法
date=toDateLinux(dateStr);
} else{
//若是winow环境,执行之前原始方法
date=stringToDate(dateStr);
}
return date;
}
修改相应的页面调用此转换方法,部署代码测试,window和Linux环境都测试正常,问题解决。
更多推荐
所有评论(0)