獲取一段時間內的每天的小時
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 [email protected]
* @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 [email protected]
* @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 [email protected]
* @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 [email protected]
* @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;
}
}