经常有报表用自然周来统计,下面是计算指定年份的每一周的开始日期与结束日期的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; }