按週期獲取時間範圍(按年、按月、按天、按小時)

package ham;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class TimeTest {

	/**
	 * @param args
	 * @throws ParseException
	 */
	public static void main(String[]args)throws ParseException {
		getLevelTime("2012-01-01 10:43:07", "2012-01-02 05:23:56", "hour");

	}

	public static void getLevelTime(String startTimeStr, String endTimeStr, String type)throws ParseException {
		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date startTime = dateFormat.parse(startTimeStr);
		Date endTime = dateFormat.parse(endTimeStr);
		Calendar startCal = Calendar.getInstance();
		Calendar endCal = Calendar.getInstance();
		startCal.setTime(startTime);
		endCal.setTime(endTime);

		if ("year".equals(type)) {

			//判斷是否在同一年
			if (startCal.get(Calendar.YEAR) == endCal.get(Calendar.YEAR)) {
				System.out.println("同一年內");
			} else {
				//最開始一年最後時刻,月份比正常認知少一個數
				Calendar startCal_ = Calendar.getInstance();
				startCal_.set(startCal.get(Calendar.YEAR), 11, 31, 23, 59, 59);
				//最後一年開始時刻
				Calendar endCal_ = Calendar.getInstance();
				endCal_.set(endCal.get(Calendar.YEAR), 0, 1, 0, 0, 0);

				//開始時間
				System.out.print(dateFormat.format(startCal.getTime()) + "---");
				//最開始一年  末尾
				System.out.println(dateFormat.format(startCal_.getTime()));

				//中間年數
				int count = (int)(((endCal_.getTime().getTime() - startCal_.getTime().getTime()) / (24 * 60 * 60 * 1000)) / 365);
				for (int j = 0; j < count; j++) {
					//第n年  起始
					startCal_.set(Calendar.SECOND, 60);
					System.out.print(dateFormat.format(startCal_.getTime()) + "---");

					//第n年 末尾
					startCal_.set(Calendar.YEAR, startCal_.get(Calendar.YEAR));
					startCal_.set(Calendar.MONTH, 11); //  ***月份設置***
					startCal_.set(Calendar.DATE, 31);
					startCal_.set(Calendar.HOUR, 23);
					startCal_.set(Calendar.MINUTE, 59);
					startCal_.set(Calendar.SECOND, 59);
					System.out.println(dateFormat.format(startCal_.getTime()));
				}

				//最後一年  開始
				System.out.print(dateFormat.format(endCal_.getTime()) + "---");
				//結束時間
				System.out.println(dateFormat.format(endCal.getTime()));

			}

		}

		if ("month".equals(type)) {

			//判斷是否在同一年
			if (startCal.get(Calendar.YEAR) == endCal.get(Calendar.YEAR) && startCal.get(Calendar.MONTH) == endCal.get(Calendar.MONTH)) {
				System.out.println("同一月內");
			} else {
				//最開始一個月最後時刻,重點在於設置一個月中的天數(每月的天數不一樣)
				Calendar startCal_ = Calendar.getInstance();
				startCal_.set(startCal.get(Calendar.YEAR), startCal.get(Calendar.MONTH), startCal.getActualMaximum(Calendar.DATE), 23, 59, 59);
				//最後一個月開始時刻
				Calendar endCal_ = Calendar.getInstance();
				endCal_.set(endCal.get(Calendar.YEAR), endCal.get(Calendar.MONTH), 1, 0, 0, 0);

				//開始時間
				System.out.print(dateFormat.format(startCal.getTime()) + "---");
				//最開始一個月  末尾
				System.out.println(dateFormat.format(startCal_.getTime()));

				//中間月數
				int count = (int)(((endCal_.getTime().getTime() - startCal_.getTime().getTime()) / (24 * 60 * 60 * 1000)) / 30);
				for (int j = 0; j < count; j++) {
					//第n個月  起始
					startCal_.set(Calendar.SECOND, 60);
					System.out.print(dateFormat.format(startCal_.getTime()) + "---");

					//第n個月 末尾
					startCal_.set(Calendar.MONTH, startCal_.get(Calendar.MONTH));
					//根據具體時間獲取其所在月的天數 ***
					startCal_.set(Calendar.DATE, startCal_.getActualMaximum(Calendar.DATE));
					startCal_.set(Calendar.HOUR, 23);
					startCal_.set(Calendar.MINUTE, 59);
					startCal_.set(Calendar.SECOND, 59);
					System.out.println(dateFormat.format(startCal_.getTime()));
				}

				//最後一個月  開始
				System.out.print(dateFormat.format(endCal_.getTime()) + "---");
				//結束時間
				System.out.println(dateFormat.format(endCal.getTime()));

			}

		} else if ("day".equals(type)) {

			//判斷是否在同一天
			if (startCal.get(Calendar.YEAR) == endCal.get(Calendar.YEAR) && startCal.get(Calendar.MONTH) == endCal.get(Calendar.MONTH) && startCal.get(Calendar.DATE) == endCal.get(Calendar.DATE)) {
				System.out.println("同一天內");
			} else {
				//第一天最後時刻
				Calendar startCal_ = Calendar.getInstance();
				startCal_.set(startCal.get(Calendar.YEAR), startCal.get(Calendar.MONTH), startCal.get(Calendar.DATE), 23, 59, 59);
				//最後一天開始時刻
				Calendar endCal_ = Calendar.getInstance();
				endCal_.set(endCal.get(Calendar.YEAR), endCal.get(Calendar.MONTH), endCal.get(Calendar.DATE), 0, 0, 0);

				//開始時間
				System.out.print(dateFormat.format(startCal.getTime()) + "---");
				//第一天  末尾
				System.out.println(dateFormat.format(startCal_.getTime()));

				//中間天數
				int count = (int)((endCal_.getTime().getTime() - startCal_.getTime().getTime()) / (24 * 60 * 60 * 1000));
				for (int j = 0; j < count; j++) {
					//第n天  起始
					startCal_.set(Calendar.SECOND, 60);
					System.out.print(dateFormat.format(startCal_.getTime()) + "---");

					//第n天 末尾
					startCal_.set(Calendar.DATE, startCal_.get(Calendar.DATE));
					startCal_.set(Calendar.HOUR, 23);
					startCal_.set(Calendar.MINUTE, 59);
					startCal_.set(Calendar.SECOND, 59);
					System.out.println(dateFormat.format(startCal_.getTime()));
				}

				//最後一天  開始
				System.out.print(dateFormat.format(endCal_.getTime()) + "---");
				//結束時間
				System.out.println(dateFormat.format(endCal.getTime()));

			}

		} else if ("hour".equals(type)) {

			//判斷是否在同一小時
			if (startCal.get(Calendar.YEAR) == endCal.get(Calendar.YEAR) && startCal.get(Calendar.MONTH) == endCal.get(Calendar.MONTH) && startCal.get(Calendar.DATE) == endCal.get(Calendar.DATE) && startCal.get(Calendar.HOUR) == endCal.get(Calendar.HOUR)) {
				System.out.println("同一小時內");
			} else {
				//最開始一小時最後時刻
				Calendar startCal_ = Calendar.getInstance();
				startCal_.set(startCal.get(Calendar.YEAR), startCal.get(Calendar.MONTH), startCal.get(Calendar.DATE), startCal.get(Calendar.HOUR_OF_DAY), 59, 59);
				//最後一小時開始時刻
				Calendar endCal_ = Calendar.getInstance();
				endCal_.set(endCal.get(Calendar.YEAR), endCal.get(Calendar.MONTH), endCal.get(Calendar.DATE), endCal.get(Calendar.HOUR_OF_DAY), 0, 0);

				//開始時間
				System.out.print(dateFormat.format(startCal.getTime()) + "---");
				//最開始一小時  末尾
				System.out.println(dateFormat.format(startCal_.getTime()));

				//中間小時數
				int count = (int)((endCal_.getTime().getTime() - startCal_.getTime().getTime()) / (60 * 60 * 1000));
				for (int j = 0; j < count; j++) {
					//第n個小時  起始
					startCal_.set(Calendar.SECOND, 60);
					System.out.print(dateFormat.format(startCal_.getTime()) + "---");

					//第n個小時 末尾
					startCal_.set(Calendar.HOUR, startCal_.get(Calendar.HOUR));
					startCal_.set(Calendar.MINUTE, 59);
					startCal_.set(Calendar.SECOND, 59);
					System.out.println(dateFormat.format(startCal_.getTime()));
				}

				//最後一小時  開始
				System.out.print(dateFormat.format(endCal_.getTime()) + "---");
				//結束時間
				System.out.println(dateFormat.format(endCal.getTime()));

			}

		}

	}

}

 

** 幾個重點注意的地方:
1.月份設置(根據實際時間所在的月份設置該月的天數)
    startCal.getActualMaximum(Calendar.DATE)
2.獲得24小時制的小時數值
    Calendar   date   =   Calendar.getInstance();  
    date.get(Calendar.HOUR_OF_DAY   );//獲得24小時機制的  
    date.get(Calendar.HOUR);//   獲得12小時機制的java

相關文章
相關標籤/搜索