计算经过时间范围

原创 2016年08月29日 09:51:14

由于公司业务变更,计算夜间服务费晚上23点–早上5点为夜间服务费时间,按分钟收费,考虑各种情况最后想出简单计算规则

这里写代码片
    /**
     * 分钟计算单位
     */
    private static final int MINTUS_TIME_UNIT=60000;
    /**
     * 天计算单位
     */
    private static final int DAY_TIME_UNIT=24*3600000;
    /**
     * 计算夜间服务时长
     * @param startTime
     * @param timeLenght
     * @return
     */
    public static int getNightServiceTimeLong(Date startTime,long timeLong){
        return getNightServiceTimeLong(startTime,new Date(startTime.getTime()+timeLong));
    }

    /**
     * 计算夜间服务时长(返回单位分钟)
     * @param startTime开始时间
     * @param endTime 结束时间
     * @return
     */
    public static int getNightServiceTimeLong(Date startTime, Date endTime){
        long startLong=getDateTimetoLong(startTime);
        long endLong=getDateTimetoLong(endTime);
        DateTime startDate=new DateTime(startTime).withTime(5,0,0, 0);
        DateTime start=new DateTime(startTime).withTime(23,0,0, 0);
        DateTime end=new DateTime(endTime).withTime(5,0,0, 0);
        DateTime endDate=new DateTime(endTime).withTime(23,0,0, 0);

        long startMillis=start.getMillis();
        long endMillis=end.getMillis();

        int sumMinus=calDayDiffer(startMillis,endDate.getMillis())*360;

        int startDiffer=calMintusDiffer(startMillis,startLong);
        if(startDiffer>0){
            sumMinus-=startDiffer;
        }
        int endDiffer=calMintusDiffer(endMillis,endLong);
        if(endDiffer<0){
            sumMinus+=endDiffer;
        }
        int endMany=calMintusDiffer(endDate.getMillis(),endLong);
        if(endMany>0){
            sumMinus+=endMany;
        }
        int startMany=calMintusDiffer(startLong,Math.min(startDate.getMillis(),endLong));
        if(startMany>0&&startMany<300){
            sumMinus+=startMany;
        }
        return sumMinus;
    }
    private static long getDateTimetoLong(Date date){
        return new DateTime(date).withSecondOfMinute(0).withMillisOfSecond(0).getMillis();
    }
    private static int calDayDiffer(long start,long end){
        return (int)((end-start)/DAY_TIME_UNIT);
    }
    /**
     * 计算时差 返回单位分钟
     * @param start
     * @param end
     * @return
     */
    private static int calMintusDiffer(long start,long end){
        return (int)((end-start)/MINTUS_TIME_UNIT);
    }

相关文章推荐

YT14-HDU-求范围内多个数经过变换后的那个最大值

Problem Description Problems in Computer Science are often classified as belonging to a certain cla...

c#:猜数字游戏!系统随机给出一个0至99(包括0和99)之间的数字,然后让你猜是什么数字。你可以随便猜一个数字,游戏会提示太大还是太小,从而缩小结果范围。经过几次猜测与提示后,最终推出答案

随机给出一个0至99(包括0和99)之间的数字,然后让你猜是什么数字。你可以随便猜一个数字, 游戏会提示太大还是太小,从而缩小结果范围。经过几次猜测与提示后,最终推出答案。 提示:1)单击“开...

C#计算时间--按照日期确定第几周 按照第几周确定日期范围

using System; using System.Globalization; namespace ConvertDateTime { /// /// ConvertDateTime ...
  • meeweed
  • meeweed
  • 2011年08月29日 15:58
  • 691

所有时间都不是虚度的,经过定有痕迹

在CDC的这三年多,真是转瞬即逝,想想这三年多的时光, 怎么ganj

经过一年时间的沉淀 再次回首 TCP Socket服务器编程

------------------ 前言 ------------------ 开发了这么多年,发现最困难的程序开发就是通讯系统。   其他大部分系统,例如CRM/CMS/权限框架/MIS...
  • e_wsq
  • e_wsq
  • 2013年10月16日 03:15
  • 955

经过一年时间的沉淀 再次回首 TCP Socket服务器编程

经过一年时间的沉淀 再次回首 TCP Socket服务器编程 ------------------ 前言 ------------------ 开发了这么多年,发现最困难的程序开发...

酒店入住离店时间范围选择插件

  • 2017年09月12日 10:03
  • 50KB
  • 下载

UIPickerView加一个时间范围的demo

  • 2015年04月30日 09:12
  • 42KB
  • 下载

mongodb中根据时间范围进行查询

时间字段处于数据顶层结构中例如: 当前数据库中有1000条数据,数据的结构为:{ "_id" : { "$oid" : "587dc4069f527a223ca81f4f" }, "...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:计算经过时间范围
举报原因:
原因补充:

(最多只允许输入30个字)