时间精确到0.5天,不足12小时为半天

本文介绍了一个项目中关于出差天数计算的问题,原本可能得出如0.125、1.125等不直观的小数结果。通过代码优化,将时间精确到0.5天,不足12小时计为半天,使得出差天数显示更加准确,便于理解和使用。这种方法来源于实际项目经验,适合需要类似解决方案的开发者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以项目为示例:

出差模块设有开始时间和结束时间,这两个字段是有在数据库里存在的,现在有一个出差天数,这个出差天数是根据结束时间减去开始时间得到的,如下代码:

<@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+"");

 第二段可放在我们需要放的方法里面,这样下来,出差天数的显示就是准确的了,如下图:

 这些也是因为在自己的项目中发现了的小问题,所以写下来也算是记录了,有需要用到的可以看看,根据自己项目的代码适当的修改,还是可以用得到的!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值