日常工作,公司安排要将原来跑在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环境都测试正常,问题解决。

Logo

更多推荐