JAVA计算指定年份每一周开始日期与结束日期

经常有报表用自然周来统计,下面是计算指定年份的每一周的开始日期与结束日期的java代码 .

package com.dgmislrh;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map.Entry;


public class F {

	public F() {
		// TODO Auto-generated constructor stub
	}
	private static Date deformatDatetime(String strDate, String fmt) {
		try {
			if (fmt == null) {
				return (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",
						java.util.Locale.ENGLISH)).parse(strDate);
			} else {
				return (new SimpleDateFormat(fmt, java.util.Locale.ENGLISH))
						.parse(strDate);
			}
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}
	private static String datetimeToString(Date dt, String fmt) {
		if (fmt == null) {
			return (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",
					java.util.Locale.ENGLISH)).format(dt);
		} else {
			return (new SimpleDateFormat(fmt, java.util.Locale.ENGLISH))
					.format(dt);
		}
	}
	private static class DateRange{
		public Date startDate;
		public Date endDate;
		public DateRange(){
			
		}
		public DateRange(Date dt1,Date dt2){
			startDate=dt1;
			endDate=dt2;
		}		
	}
	/**
	 * 根據年份獲得該年所有周次及每周的開始-結束日期
	 * @param pvnYear
	 * @return
	 */
	private static LinkedHashMap<Integer,DateRange> getWeeksDetByYear(int pvnYear){
		LinkedHashMap<Integer, DateRange> lvRet=new LinkedHashMap<Integer,DateRange>();
		Calendar lvCal=Calendar.getInstance();
		lvCal.setFirstDayOfWeek(Calendar.MONDAY);
		
		Date lvDt=deformatDatetime(String.valueOf(pvnYear)+"-01-01 00:00:00", null);
		lvCal.setTime(lvDt);
		int lvWeek=1;
		while (true) {
			lvCal.set(Calendar.DAY_OF_WEEK, lvCal.getFirstDayOfWeek()); // Monday
			Date lvFirstDt=lvCal.getTime();
			if (lvFirstDt.getYear()+1900<pvnYear){
				lvFirstDt=lvDt;
			}
			if (lvFirstDt.getYear()+1900>pvnYear) break;
			lvCal.set(Calendar.DAY_OF_WEEK, lvCal.getFirstDayOfWeek()+6); // Sunday?
			Date lvLastDt=lvCal.getTime();
			if (lvLastDt.getYear()+1900>pvnYear){
				lvLastDt=deformatDatetime(String.valueOf(pvnYear+1)+"-01-01 00:00:00", null);
				lvCal.setTime(lvLastDt);
				lvCal.add(Calendar.DAY_OF_YEAR, -1);
				lvLastDt=lvCal.getTime();
			}
			lvRet.put(Integer.valueOf(lvWeek), new DateRange(lvFirstDt, lvLastDt));
			lvWeek++;
			lvCal.add(Calendar.WEEK_OF_YEAR, 1);
		}
		return lvRet;
	}
	public static void main(String[] args) {		
		LinkedHashMap<Integer,DateRange>  lvRet=getWeeksDetByYear(2018);
		for (Entry<Integer, DateRange> item:lvRet.entrySet()){
			System.out.println(String.format("Week: %d, %s - %s", item.getKey(),datetimeToString(item.getValue().startDate,"yyyy-MM-dd"),
					datetimeToString(item.getValue().endDate,"yyyy-MM-dd")));
		}
	}

} 


输出:

Week: 1, 2018-01-01 - 2018-01-07
Week: 2, 2018-01-08 - 2018-01-14
Week: 3, 2018-01-15 - 2018-01-21
Week: 4, 2018-01-22 - 2018-01-28
Week: 5, 2018-01-29 - 2018-02-04
Week: 6, 2018-02-05 - 2018-02-11
Week: 7, 2018-02-12 - 2018-02-18
Week: 8, 2018-02-19 - 2018-02-25
Week: 9, 2018-02-26 - 2018-03-04
Week: 10, 2018-03-05 - 2018-03-11
Week: 11, 2018-03-12 - 2018-03-18
Week: 12, 2018-03-19 - 2018-03-25
Week: 13, 2018-03-26 - 2018-04-01
Week: 14, 2018-04-02 - 2018-04-08
Week: 15, 2018-04-09 - 2018-04-15
Week: 16, 2018-04-16 - 2018-04-22
Week: 17, 2018-04-23 - 2018-04-29
Week: 18, 2018-04-30 - 2018-05-06
Week: 19, 2018-05-07 - 2018-05-13
Week: 20, 2018-05-14 - 2018-05-20
Week: 21, 2018-05-21 - 2018-05-27
Week: 22, 2018-05-28 - 2018-06-03
Week: 23, 2018-06-04 - 2018-06-10
Week: 24, 2018-06-11 - 2018-06-17
Week: 25, 2018-06-18 - 2018-06-24
Week: 26, 2018-06-25 - 2018-07-01
Week: 27, 2018-07-02 - 2018-07-08
Week: 28, 2018-07-09 - 2018-07-15
Week: 29, 2018-07-16 - 2018-07-22
Week: 30, 2018-07-23 - 2018-07-29
Week: 31, 2018-07-30 - 2018-08-05
Week: 32, 2018-08-06 - 2018-08-12
Week: 33, 2018-08-13 - 2018-08-19
Week: 34, 2018-08-20 - 2018-08-26
Week: 35, 2018-08-27 - 2018-09-02
Week: 36, 2018-09-03 - 2018-09-09
Week: 37, 2018-09-10 - 2018-09-16
Week: 38, 2018-09-17 - 2018-09-23
Week: 39, 2018-09-24 - 2018-09-30
Week: 40, 2018-10-01 - 2018-10-07
Week: 41, 2018-10-08 - 2018-10-14
Week: 42, 2018-10-15 - 2018-10-21
Week: 43, 2018-10-22 - 2018-10-28
Week: 44, 2018-10-29 - 2018-11-04
Week: 45, 2018-11-05 - 2018-11-11
Week: 46, 2018-11-12 - 2018-11-18
Week: 47, 2018-11-19 - 2018-11-25
Week: 48, 2018-11-26 - 2018-12-02
Week: 49, 2018-12-03 - 2018-12-09
Week: 50, 2018-12-10 - 2018-12-16
Week: 51, 2018-12-17 - 2018-12-23
Week: 52, 2018-12-24 - 2018-12-30

Week: 53, 2018-12-31 - 2018-12-31

另, 获得每个季度的日期范围函数

/***
	 * 獲得指定年份每季度的日期範圍
	 * @param pvnYear
	 */
	private static LinkedHashMap<Integer,DateRange> getQuarterDateRangeByYear(int pvnYear){
		LinkedHashMap<Integer, DateRange> lvRet=new LinkedHashMap<Integer,DateRange>();
		Calendar lvCal=Calendar.getInstance();		
		lvCal.setFirstDayOfWeek(Calendar.MONDAY);
		Date lvStartDt=deformatDatetime(String.valueOf(pvnYear)+"-01-01 00:00:00", null);
		lvCal.setTime(lvStartDt);		
		for (int i=1;i<=4;i++){
			lvCal.add(Calendar.MONTH, 2);
			lvCal.set(Calendar.DAY_OF_MONTH, lvCal.getActualMaximum(Calendar.DAY_OF_MONTH));
			Date lvLastDt=lvCal.getTime();
			lvRet.put(Integer.valueOf(i), new DateRange(lvStartDt, lvLastDt));
			lvCal.add(Calendar.DAY_OF_YEAR, 1);
			lvStartDt=lvCal.getTime();
		}
		return lvRet;
	}

猜你喜欢

转载自blog.csdn.net/rocklee/article/details/79915282