虽然java8的LocalDate已经出来,但是很多项目以及自己习惯上还是使用Date,这里还是简单介绍一下如何通过java.util.Calendar获取时间区间.
1 通过calendar.getActualMinimum,getActualMaximum获取周,月,年的最大值,最小值
1 /** 2 * @Title: getSeasonFrist 3 * @Description: 获取季度初日期 4 * @param calendar 5 * @return 6 * @throws ParseException 7 */ 8 public static String getSeasonFrist(Calendar calendar) throws ParseException { 9 int month = calendar.get(Calendar.MONTH); 10 int season = getSeason(month, 0); 11 calendar.set(Calendar.DAY_OF_MONTH, 0); 12 calendar.set(Calendar.MONTH, season); 13 calendar.add(Calendar.DATE, calendar.getActualMinimum(Calendar.DAY_OF_MONTH)); 14 return sdf.format(calendar.getTime()); 15 } 16 17 /** 18 * @Title: getSeasonLast 19 * @Description: 获取季度末日期时间 20 * @param calendar 21 * @return 22 * @throws ParseException 23 */ 24 public static String getSeasonLast(Calendar calendar) throws ParseException { 25 int month = calendar.get(Calendar.MONTH); 26 int season = getSeason(month, 1); 27 calendar.set(Calendar.MONTH, season); 28 calendar.set(Calendar.DAY_OF_MONTH, -1); 29 calendar.add(Calendar.DATE, calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); 30 return sdf.format(calendar.getTime()); 31 }
问题,因为直接设置月份,除了月份其他信息没有改,会造成获取月份最大值不准确,即当前月是9月,我把月份改成10,但是9月的最大天数是30,所以获取月份最后一天就是:10月30日
方式二:通过获取下月月初减一的方式获取区间最后一天,这种方式可简单有效解决月末日期不准确问题
1 /** 2 * @Title: getSeasonFrist 3 * @Description: 获取季度初日期 4 * @param calendar 5 * @return 6 * @throws ParseException 7 */ 8 public static String getSeasonFrist(Calendar calendar) throws ParseException { 9 int month = calendar.get(Calendar.MONTH); 10 int season = getSeason(month, 0); 11 calendar.set(Calendar.MONTH, season); 12 calendar.set(Calendar.DAY_OF_MONTH, 1); 13 return sdf.format(calendar.getTime()); 14 } 15 16 /** 17 * @Title: getSeasonLast 18 * @Description: 获取季度末日期时间 19 * @param calendar 20 * @return 21 * @throws ParseException 22 */ 23 public static String getSeasonLast(Calendar calendar) throws ParseException { 24 int month = calendar.get(Calendar.MONTH); 25 int season = getSeason(month, 1); 26 calendar.set(Calendar.MONTH, season + 1); 27 calendar.set(Calendar.DAY_OF_MONTH, 0); 28 return sdf.format(calendar.getTime()); 29 }
这里用季度的例子举例,月和年类似;因为calendar没有直接获取季度的方法,季度的区间需要自己定义,其实就是获取当前月,然后自己定义每个月属于哪个季度,并返回季度首尾的月份;