获取一段时间内的每天的小时
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
/**
* 获取一段时间内的每天的小时
* input->2019-11-21 12:21:30 ~ 2019-12-03 13:30:00
* output->
2019-11-21 : 11.641666
2019-11-22 : 24.0
2019-11-23 : 24.0
2019-11-24 : 24.0
2019-11-25 : 24.0
2019-11-26 : 24.0
2019-11-27 : 24.0
2019-11-28 : 24.0
2019-11-29 : 24.0
2019-11-30 : 24.0
2019-12-01 : 24.0
2019-12-02 : 24.0
2019-12-03 : 13.5
* @author hsj-2356899074@qq.com
* @date 2019年12月3日 下午1:12:48
*
*/
public class DateTest {
private final static float MillSecond2Hour = 1000 * 60 * 60;
private final static String dBegin = "2019-11-21 12:21:30";
private final static String dEnd = "2019-12-03 13:30:00";
private final static String str00_00_00 = " 00:00:00";
private final static String str23_59_59 = " 23:59:59";
private final static long oneMillSecond = 1000L;
public static void main(String[] args) throws ParseException {
System.out.println(String.format("获取一段时间内【%s,%s】的总小时:%s", dBegin,dEnd,getAllHours(dBegin,dEnd)));
// findDatesFromRange(dBegin,dEnd).stream().forEach(x -> {
// System.out.println(x);
// });
float allHours = 0.0f;
Iterator<Entry<String, Float>> iterator = findAsAllDate(findDatesFromRange(dBegin,dEnd)).entrySet().iterator();
while(iterator.hasNext()){
Entry<String, Float> entry = iterator.next();
System.out.println(entry.getKey() + " : " + entry.getValue());
allHours += entry.getValue();
}
System.out.println(String.format("重新计算——>获取一段时间内【%s,%s】的总小时:%s", dBegin,dEnd,allHours));
}
/**
*
* @Title: DateTest.java
* @Package test
* @Description: TODO(获取一段时间内的总小时)
* @author hsj-2356899074@qq.com
* @date 2019年12月3日 下午1:25:45
*/
public static float getAllHours(String dBegin, String dEnd){
DateFormat format_normal = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
long gapMillSecond = 0L;
try {
gapMillSecond = format_normal.parse(dEnd).getTime() - format_normal.parse(dBegin).getTime();
} catch (Exception e) {
e.printStackTrace();
}
return gapMillSecond / MillSecond2Hour;
}
/**
*
* @Title: DateTest.java
* @Package test
* @Description: TODO(以第一个开始,分隔成天yyyy-MM-dd HH:mm:ss)
* @author hsj-2356899074@qq.com
* @date 2019年12月3日 下午4:01:01
*/
public static List<String> findDatesFromRange(String dBegin, String dEnd) {
dBegin = dBegin.trim();
dEnd = dEnd.trim();
//装返回的日期集合容器
List<String> Datelist = new ArrayList<String>();
//日期工具类准备
DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
//设置开始时间
Calendar calBegin = Calendar.getInstance();
calBegin.setTime(format.parse(dBegin));
//设置结束时间
Calendar calEnd = Calendar.getInstance();
calEnd.setTime(format.parse(dEnd));
// 每次循环给calBegin日期加一天,直到calBegin.getTime()时间等于dEnd
Datelist.add(format.format(calBegin.getTime()));
while (format.parse(dEnd).after(calBegin.getTime())) {
// 根据日历的规则,为给定的日历字段添加或减去指定的时间量
calBegin.add(Calendar.DAY_OF_MONTH, 1);
if(calBegin.getTimeInMillis() <= calEnd.getTimeInMillis()){
//最后一个特殊处理
//.substring(0, 10) 截取-> 年-月-日
if(format.format(calBegin.getTime()).trim().substring(0, 10).equals(dEnd.substring(0, 10))){
Datelist.add(dEnd);break;
}else{
Datelist.add(format.format(calBegin.getTime()));
}
}else{
Datelist.add(dEnd);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return Datelist;
}
/**
*
* @Title: DateTest.java
* @Package test
* @Description: TODO(以第一个开始,分割成KEY:yyyy-MM-dd 、value:小时)
* @author hsj-2356899074@qq.com
* @date 2019年12月3日 下午4:01:31
*/
public static Map<String,Float> findAsAllDate(List<String> listDate){
//天,时长(小时)
Map<String,Float> Datelist = new HashMap<String,Float>();
DateFormat format_normal = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
for(int i = 0,iLen = listDate.size(); i < iLen; i++){
if(i == (iLen - 1)){break;}
String dateCurrent = listDate.get(i).trim();
String dateNext = listDate.get(i + 1).trim();
String dateCurrentYMD = listDate.get(i).trim().substring(0, 10);
String dateNextYMD = listDate.get(i + 1).trim().substring(0, 10);
long gapMillSecond =0L;
try {
//同一天
if(dateCurrentYMD.equals(dateNextYMD)){
gapMillSecond = format_normal.parse(dateNext).getTime() - format_normal.parse(dateCurrent).getTime();
Datelist.put(dateCurrentYMD, gapMillSecond / MillSecond2Hour);
break;
}
//第一个
if(i == 0){
gapMillSecond = format_normal.parse(dateCurrentYMD + str23_59_59).getTime() + oneMillSecond - format_normal.parse(dateCurrent).getTime();
Datelist.put(dateCurrentYMD, gapMillSecond / MillSecond2Hour);
}
//第一个,只有2个
if(i == 0 && iLen == 2){
gapMillSecond = format_normal.parse(dateNext).getTime() - format_normal.parse(dateNextYMD + str00_00_00).getTime();
Datelist.put(dateNextYMD, gapMillSecond / MillSecond2Hour);
break;
}
//最后一个,和倒数第二个
if(!dateCurrentYMD.equals(dateNextYMD) && i == (iLen - 2)){
gapMillSecond = format_normal.parse(dateCurrentYMD + str23_59_59).getTime() + oneMillSecond - format_normal.parse(dateCurrentYMD + str00_00_00).getTime();
Datelist.put(dateCurrentYMD, gapMillSecond / MillSecond2Hour);
gapMillSecond = format_normal.parse(dateNext).getTime() - format_normal.parse(dateNextYMD + str00_00_00).getTime();
Datelist.put(dateNextYMD, gapMillSecond / MillSecond2Hour);
break;
}
//中间
if(i > 0 && i < (iLen - 2)){
gapMillSecond = format_normal.parse(dateCurrentYMD + str23_59_59).getTime() + oneMillSecond - format_normal.parse(dateCurrentYMD + str00_00_00).getTime();
Datelist.put(dateCurrentYMD, gapMillSecond / MillSecond2Hour);
}
} catch (Exception e) {
e.printStackTrace();
}
}
//排序KEY值
Map<String, Float> resultMap = new LinkedHashMap<String, Float>();
//sort by key, a,b,c..., and put it into the "result" map
Datelist.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.forEachOrdered(k -> resultMap.put(k.getKey(), k.getValue()));
return resultMap;
}
}