獲取一段時間內的每天的小時

獲取一段時間內的每天的小時

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;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章