public static longgetSpanHour(String string_time_in, String string_time_out, String string_free_start,

String string_free_end) {try{//包含的完整的免费时段次数

int span_times = 0;//跨天停车标识符

boolean dayFlag = false;

String date= string_time_in.substring(0, 10);

string_free_start= date + " " +string_free_start;

string_free_end= date + " " +string_free_end;//驶入时间

Timestamp time_in =Timestamp.valueOf(string_time_in);//驶出时间

Timestamp time_out =Timestamp.valueOf(string_time_out);long span_hour = (time_out.getTime() - time_in.getTime()) / (60 * 60 * 1000);//超时停车标识符

boolean overFlag = false;if ((time_out.getTime() - time_in.getTime()) % (60 * 60 * 1000) / (60 * 1000) > 5) {

overFlag= true;

}//免费停车标识符

boolean free = false;//免费时段开始

Timestamp free_start =Timestamp.valueOf(string_free_start);//免费时段结束

Timestamp free_end =Timestamp.valueOf(string_free_end);//免费时段时长(小时)

long span_free_hour = (free_end.getTime() - free_start.getTime()) / (60 * 60 * 1000) + 24;//停车时间超过24小时,跨天停车标识符为true,减去一个免费时段时长

long boundary =span_hour;while (boundary >= 24) {

boundary-= 24;

span_times++;

dayFlag= true;

}

span_hour= span_hour - span_times *span_free_hour;//时间转化为同一天进行计算剩余时长

time_in.setYear(time_out.getYear());

time_in.setMonth(time_out.getMonth());

time_in.setDate(time_out.getDate());

free_start.setYear(time_out.getYear());

free_start.setMonth(time_out.getMonth());

free_start.setDate(time_out.getDate());

free_end.setYear(time_out.getYear());

free_end.setMonth(time_out.getMonth());

free_end.setDate(time_out.getDate());if (time_in.before(free_end) || time_in.after(free_start)) {//免费时段驶入

if (time_out.before(free_end) || time_out.after(free_start)) {//免费时段驶出

overFlag = false;if (dayFlag) {//跨天停车

if (time_in.before(time_out)) {//转化为一天后,驶入时间在驶出时间之前

span_hour -= (time_out.getTime() - time_in.getTime()) / (60 * 60 * 1000);

}else if (time_in.after(time_out)) {//转化为一天后,驶入时间在驶出时间之后

span_hour -= 24 - Math.ceil((time_in.getTime() - time_out.getTime()) / (60.0 * 60 * 1000));

}else{//do nothing

}

}else {//非跨天停车

if (time_in.before(time_out)) {//转化为一天后,驶入时间在驶出时间之前

span_hour = 0;

free= true;

}else if (time_in.after(time_out)) {//转化为一天后,驶入时间在驶出时间之后

span_hour -=span_free_hour;

}else{//do nothing

}

}

}else {//非免费时段驶出

if((time_out.getTime() - free_end.getTime()) % (60 * 60 * 1000) / (60 * 1000) <= 5) {

overFlag= false;

}if (dayFlag) {//跨天停车

if (time_in.before(time_out)) {//转化为一天后,驶入时间在驶出时间之前

span_hour -= (free_end.getTime() - time_in.getTime()) / (60 * 60 * 1000);

}else if (time_in.after(time_out)) {//转化为一天后,驶入时间在驶出时间之后

span_hour -= 24 - (time_in.getTime() - free_end.getTime()) / (60 * 60 * 1000);

}

}else {//非跨天停车

if (time_in.before(time_out)) {//转化为一天后,驶入时间在驶出时间之前

span_hour -= (free_end.getTime() - time_in.getTime()) / (60 * 60 * 1000);

}else if (time_in.after(time_out)) {//转化为一天后,驶入时间在驶出时间之后

span_hour -= 24 - (time_in.getTime() - free_end.getTime()) / (60 * 60 * 1000);

}

}

}

}else {//非免费时段驶入

if (time_out.before(free_end) || time_out.after(free_start)) {//免费时段驶出

if (dayFlag) {//跨天停车

if (time_in.before(time_out)) {//转化为一天后,驶入时间在驶出时间之前

span_hour -= (time_out.getTime() - free_start.getTime()) / (60 * 60 * 1000);

}else if (time_in.after(time_out)) {//转化为一天后,驶入时间在驶出时间之后//do nothing

}

}else {//非跨天停车

if (time_in.before(time_out)) {//转化为一天后,驶入时间在驶出时间之前

span_hour -= (time_out.getTime() - free_start.getTime()) / (60 * 60 * 1000);

}else if (time_in.after(time_out)) {//转化为一天后,驶入时间在驶出时间之后//do nothing

}

}

}else {//非免费时段驶出

if (dayFlag) {//跨天停车

if (time_in.before(time_out)) {//转化为一天后,驶入时间在驶出时间之前//do nothing

} else if (time_in.after(time_out)) {//转化为一天后,驶入时间在驶出时间之后

span_hour -= 24 - ((time_in.getTime() - time_out.getTime()) / (60 * 60 * 1000));

span_hour+= (free_start.getTime() - time_in.getTime()) / (60 * 60 * 1000);

span_hour+= (time_out.getTime() - free_end.getTime()) / (60 * 60 * 1000);

}

}else {//非跨天停车

if (time_in.before(time_out)) {//转化为一天后,驶入时间在驶出时间之前//do nothing

} else if (time_in.after(time_out)) {//转化为一天后,驶入时间在驶出时间之后//do nothing

}

}

}

}//超过5分钟按一小时

if(overFlag) {

span_hour++;

}if (free || span_hour < 0) {

span_hour= 0;

}returnspan_hour;

}catch(Exception exception) {

exception.printStackTrace();

}return 0;

}

java时间段收费_Java实现免费时段计算相关推荐

  1. java 时间段重叠_java 判断两个时间段是否重叠的案例

    java 判断两个时间段是否重叠的案例 发布时间:2020-10-21 16:08:51 来源:脚本之家 阅读:108 作者:SakuyaM 最近业务上遇到需要判断两个时间段是否存在重叠的情况,网上找 ...

  2. java延迟函数_Java 8:延迟计算

    Java8:Stream概念的细化,讨论延迟计算/惰性求值Lazy Evaluations. Java中常见的逻辑操作be1&&f(),是短路/short-circuiting计算,避 ...

  3. java 10000阶乘_Java ForkJoinPool: 3秒计算100万的阶乘

    问题背景&思路 如果需要计算100的阶乘,那应该怎么做? 方法1: for循环(默认,单线程) 方法2: 多线程,MapReduce思想 main线程开启多个子任务(个数=CPU核心数),放到 ...

  4. java 时间戳最大值_Java中在时间戳计算的过程中遇到的数据溢出问题解决

    背景 今天在跑定时任务的过程中,发现有一个任务在设置数据的查询时间范围异常,出现了开始时间戳比结束时间戳大的奇怪现象,计算时间戳的代码大致如下. package com.lingyejun.authe ...

  5. java 公历 农历_Java给定公历日期计算相应农历/阴历日期

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...

  6. java 时间段重叠_Java判断多个时间段是否重叠(重叠区间个数)

    import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * 判断多个时间段是否出现重叠 ...

  7. java 小数精确_Java中小数精确计算

    小数精确计算 System.out.println(2.00 -1.10);//0.8999999999999999 上面的计算出的结果不是 0.9,而是一连串的小数.问题在于1.1这个数字不能被精确 ...

  8. java 自然周_java 使用Calendar类计算每月有多少自然周,并输出每周的开始和结束日期...

    思路:首先是获取该月的实际天数,然后从1号遍历直至该月最后一天,利用Calendar类找出该日是一周中的第几天, (1)若该日是周日,则视为一周结束,并用该日期减去6找到该周的开始日期,若相减结果小于 ...

  9. java 停车收费_java 编程,停车收费简易系统

    展开全部 代码如下,仅实现功能,未考虑安全等情况.//ParkingTest.java /** * 停车程序入口32313133353236313431303231363533e4b893e5b19e ...

最新文章

  1. 面试官问我:什么是高并发下的请求合并?
  2. 辞职后五险一金的处理方式
  3. [转]DPM2012系列之四:配置邮件报警功能
  4. java基础之 “==”和“ equals”以及instanceof的区别
  5. 阿里张磊:云计算生态价值点正迅速聚焦到“应用”上
  6. python可以处理什么文件夹_Python处理文件和文件夹的10条命令
  7. centos 对某ip开放 防火墙端口_CentOS7 firewalld防火墙指定IP与端口访问
  8. vs 本地调试(IIS)
  9. AV Linux 2016系统今年发布:影音制作专用
  10. Oracle 之 用户与权限
  11. JAVA入门级教学之(方法重写/方法重载)
  12. 南开大学计算机考研2019分数线,2019年南开大学考研复试分数线已公布
  13. Elasticsearch安装-源码
  14. tomcat中开启SSL
  15. Jmeter接口压力测试学习总结
  16. IBM Tivoli Management Framework默认设置漏洞
  17. 「镁客·请讲」移康智能朱鹏程:做产品就要直击痛点,多余的功能只会是噱头...
  18. golang 根据生日计算星座和属相
  19. MediaPlayer的消息机制分析
  20. LINUX JDK 安装与环境变量设置

热门文章

  1. 常州一院有全消化道的机器人的_快讯!常州市首例第四代“达芬奇机器人”手术在常州一院成功实施!...
  2. 小猪短租携手飞猪:共享住宿首推“先住后付”
  3. mysql 定期清理表数据_mysql 定期清理表数据库
  4. Apache Spark 3.2 内置支持会话窗口
  5. Eclipse 添加依赖 库 Libary
  6. IIS上安装Web平台安装程序
  7. c语言整形符号位_基本整形型变量-在C语言中,整型常量与整型变量的区别是什么?举例...
  8. 记录工作中遇到的正则表达式
  9. ​pmp是什么证,如何考取?
  10. 互联网电商大数据环境 ——大数飓数据分析实践培训精华笔记(一)——简介入门