以项目为示例:
出差模块设有开始时间和结束时间,这两个字段是有在数据库里存在的,现在有一个出差天数,这个出差天数是根据结束时间减去开始时间得到的,如下代码:
<@f.hidden id="days" name="days"/>
function submitHandler() {
if (opt.validate.form()) {
$("#days").val(GetNumberOfDays($("#startDate").val(), $("#endDate").val()));
opt.operate.saveTab(prefix + "/add", $('#form-evection-add').serialize());
}
}
/**
* @return {number}
*/
function GetNumberOfDays(date1, date2) {
var startDate = Date.parse(date1);
var endDate = Date.parse(date2);
return (endDate - startDate) / (1000 * 60 * 60 * 24);
}
写完这些之后,确实是可以计算出出差的天数,但是其结果有可能是天数为0.125,1.125,或者0.000013等等这样的小数,这样的原因是,我们在设置开始时间和结束时间时,都把时间精确到了时分甚至是时分秒,那这样减下去一定会得到很多小数,试想一下,当我们看到出差天数是下图那样显示的时候,我们可以把他判定为可优化的地方:
那么我们如何避免这样一堆小数的产生呢,那就是我们可以写一些代码,将时间精确到0.5天,不足12小时的半天,代码如下:
/**
* 统计两个时间的时间差
* 相差几秒几毫秒
*/
public static Map<String, BigDecimal> getDistanceTime(Date one, Date two) {
long day = 0;//天数差
long hour = 0;//小时数差
long min = 0;//分钟数差
long second = 0;//秒数差
long diff = 0;//毫秒差
String result = null;
final Calendar c = Calendar.getInstance();
c.setTimeZone(TimeZone.getTimeZone("GMT+8:00"));
c.setTime(one);
long time1 = one.getTime();
long time2 = two.getTime();
diff = time2 - time1;
day = diff / (24 * 60 * 60 * 1000);
hour = (diff / (60 * 60 * 1000) - day * 24);
Map<String, BigDecimal> map = new HashMap();
map.put("day", BigDecimal.valueOf(day));
map.put("hour", BigDecimal.valueOf(hour));
return map;
}
Map<String, BigDecimal> distanceTime = getDistanceTime(oaEvection.getStartDate(), oaEvection.getEndDate());
BigDecimal day = distanceTime.get("day");
BigDecimal hour = distanceTime.get("hour");
if(hour.compareTo(new BigDecimal("0"))==1 && hour.compareTo(new BigDecimal("12"))!=1){
day = day.add(new BigDecimal(0.5));
}else if(hour.compareTo(new BigDecimal("12"))==1){
day = day.add(new BigDecimal("1"));
}
oaEvection.setDays(day+"");
第二段可放在我们需要放的方法里面,这样下来,出差天数的显示就是准确的了,如下图:
这些也是因为在自己的项目中发现了的小问题,所以写下来也算是记录了,有需要用到的可以看看,根据自己项目的代码适当的修改,还是可以用得到的!