|
@@ -911,7 +911,7 @@ public class DateUtils extends PropertyEditorSupport {
|
|
|
Calendar cal = Calendar.getInstance();
|
|
|
cal.setTime(date);
|
|
|
//获取当前月份
|
|
|
- int month = cal.get(Calendar.MONDAY) + 1;
|
|
|
+ int month = cal.get(Calendar.MONTH) + 1;
|
|
|
if(month<=3){
|
|
|
return 1;
|
|
|
}else if(month <=6){
|
|
@@ -925,5 +925,212 @@ public class DateUtils extends PropertyEditorSupport {
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取【所在周】周五的时间(周五为一周第一天,周四为一周最后一天)
|
|
|
+ * @param date
|
|
|
+ */
|
|
|
+ public static Date getFriday(Date date){
|
|
|
+ Calendar calendar = new GregorianCalendar();
|
|
|
+ calendar.setTime(date);
|
|
|
+ calendar.setFirstDayOfWeek(Calendar.FRIDAY);
|
|
|
+ calendar.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
|
|
|
+ DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
+ System.out.println(df.format(calendar.getTime()));
|
|
|
+ return calendar.getTime();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取传入时间的年、月份和季度(周五为每周第一天,周四为每周最后一天)
|
|
|
+ * 获取的是所属年、月、季度,因为很多月份的第一周或最后 一周会包括上一个月或者下一个月的部分日期
|
|
|
+ */
|
|
|
+ public static Map<String,Integer> getYearQuarter(Date date){
|
|
|
+ Map<String,Integer> dateMap = new HashMap<>();
|
|
|
+
|
|
|
+ Calendar calendar = new GregorianCalendar();
|
|
|
+ calendar.setTime(date);
|
|
|
+ int originYear = calendar.get(Calendar.YEAR);
|
|
|
+ int originMonth = calendar.get(Calendar.MONTH);
|
|
|
+ int originQuarter = DateUtils.getQuarter(date); //本月所在季度(按照日期来的)
|
|
|
+
|
|
|
+ Calendar calendar1 = new GregorianCalendar();
|
|
|
+ calendar1.setTime(date);
|
|
|
+ calendar1.setFirstDayOfWeek(Calendar.FRIDAY);
|
|
|
+ //1.判断当天所在周第一天是否跨月
|
|
|
+ calendar1.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
|
|
|
+ int fridayYear = calendar1.get(Calendar.YEAR);
|
|
|
+ int fridayMonth = calendar1.get(Calendar.MONTH);
|
|
|
+ int fridayQuarter = DateUtils.getQuarter(calendar1.getTime());
|
|
|
+
|
|
|
+ //2.判断当天所在周的最后一天是否跨月
|
|
|
+ Calendar calendar2 = new GregorianCalendar();
|
|
|
+ calendar2.setTime(date);
|
|
|
+ calendar2.setFirstDayOfWeek(Calendar.FRIDAY);
|
|
|
+ calendar2.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY);
|
|
|
+ int thursdayYear = calendar2.get(Calendar.YEAR);
|
|
|
+ int thursdayMonth = calendar2.get(Calendar.MONTH);
|
|
|
+ int thursdayQuarter = DateUtils.getQuarter(calendar2.getTime());
|
|
|
+
|
|
|
+ //如果本周第一天(周五)和当前天不在一个月内,说明周跨月了
|
|
|
+ if(fridayMonth == originMonth && thursdayMonth == originMonth){
|
|
|
+ dateMap.put("year", originYear);
|
|
|
+ dateMap.put("month", originMonth + 1); //最后一个月是11,应该+1
|
|
|
+ dateMap.put("quarter", originQuarter);
|
|
|
+ return dateMap;
|
|
|
+ }else if(fridayYear < originYear || (fridayYear ==originYear && fridayMonth < originMonth) ){
|
|
|
+ //判断本周有几天在本月,如果是(5,6,7)则就是本月本季度
|
|
|
+ //int lastDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
|
|
|
+ calendar1.set(Calendar.DATE, calendar1.getActualMaximum(Calendar.DATE));
|
|
|
+ int lastDateWeek = calendar1.get(Calendar.DAY_OF_WEEK);
|
|
|
+ //判断如果本周所在上个月的最后一天是周五、周六、周日的话,说明本周归属于本月(周五是第一天);否则本周归属于上个季度
|
|
|
+ if(lastDateWeek ==6 || lastDateWeek ==7 || lastDateWeek ==1 ){
|
|
|
+ dateMap.put("year", originYear);
|
|
|
+ dateMap.put("month", originMonth + 1);
|
|
|
+ dateMap.put("quarter",originQuarter);
|
|
|
+ }else{
|
|
|
+ //判断如果本周属于上个月,判断是否跨年
|
|
|
+ if(originYear == fridayYear){
|
|
|
+ dateMap.put("year", originYear);
|
|
|
+ dateMap.put("month", originMonth);
|
|
|
+ //判断是否跨季
|
|
|
+ if(originQuarter == fridayQuarter){
|
|
|
+ dateMap.put("quarter",originQuarter);
|
|
|
+ }else{
|
|
|
+ dateMap.put("quarter",fridayQuarter);
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ //跨年的话说明这周上年的12月(第四季度)
|
|
|
+ dateMap.put("year", originYear-1);
|
|
|
+ dateMap.put("month", 12); //??查看是11,还是12
|
|
|
+ dateMap.put("quarter",4);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return dateMap;
|
|
|
+ }else if(originYear < thursdayYear || (originYear == thursdayYear && originMonth < thursdayMonth) ){
|
|
|
+ calendar2.set(Calendar.DATE, 1);
|
|
|
+ int firstDateWeek = calendar2.get(Calendar.DAY_OF_WEEK);
|
|
|
+ //如果跨月的第一天是周二周三周四的话说明这周不跨月,否在进入下个月(季度、年需要再判断)
|
|
|
+ if( firstDateWeek==3 || firstDateWeek==4 || firstDateWeek==5){
|
|
|
+ dateMap.put("year", originYear);
|
|
|
+ dateMap.put("month", originMonth+1);
|
|
|
+ dateMap.put("quarter",originQuarter);
|
|
|
+ }else{
|
|
|
+ if( originYear == thursdayYear ){
|
|
|
+ dateMap.put("year", originYear);
|
|
|
+ dateMap.put("month", originMonth + 1 + 1);
|
|
|
+ //判断是否跨季
|
|
|
+ if(originQuarter == thursdayQuarter){
|
|
|
+ dateMap.put("quarter",originQuarter);
|
|
|
+ }else{
|
|
|
+ dateMap.put("quarter",thursdayQuarter);
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ //跨年的话说明这周属于明年的1月(第一季度)
|
|
|
+ dateMap.put("year", originYear+1);
|
|
|
+ dateMap.put("month", 1);
|
|
|
+ dateMap.put("quarter",1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return dateMap;
|
|
|
+ }
|
|
|
+ return dateMap;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算季度开始、结束时间
|
|
|
+ * 原则:周五为本周的第一天,下一周的周四为本周的最后一天
|
|
|
+ * @param year
|
|
|
+ * @param quarter
|
|
|
+ */
|
|
|
+ public static Map<String,String> quarterStartEndDate(int year, int quarter){
|
|
|
+ Map<String,String> quarterStartEndDateMap = new HashMap<>();
|
|
|
+
|
|
|
+ Date startDate = null;
|
|
|
+ Date endDate = null;
|
|
|
+
|
|
|
+ int startMonth = 0;
|
|
|
+ int endMonth = 0;
|
|
|
+
|
|
|
+ if(quarter == 1){
|
|
|
+ startMonth = 1;
|
|
|
+ endMonth = 3;
|
|
|
+ }else if(quarter == 2){
|
|
|
+ startMonth = 4;
|
|
|
+ endMonth = 6;
|
|
|
+ }else if(quarter == 3){
|
|
|
+ startMonth = 7;
|
|
|
+ endMonth = 9;
|
|
|
+ }else{
|
|
|
+ startMonth = 10;
|
|
|
+ endMonth = 12;
|
|
|
+ }
|
|
|
+
|
|
|
+ //判断季度第一天的时间(以周为单位,有可能是上个月,也有可能是本月的非1号)
|
|
|
+ Calendar calendar1 = new GregorianCalendar();
|
|
|
+ calendar1.set(Calendar.YEAR,year);
|
|
|
+ calendar1.set(Calendar.MONTH,startMonth-1);
|
|
|
+ calendar1.set(Calendar.DATE,1);
|
|
|
+ calendar1.setFirstDayOfWeek(Calendar.FRIDAY);
|
|
|
+
|
|
|
+ //如果季度第一个月的第一天是周二周三周四,那么这周应该归属于上个季度,否则这周(包括上个月的时间)归属于这个季度
|
|
|
+ int firstDateWeek = calendar1.get(Calendar.DAY_OF_WEEK);
|
|
|
+ if(firstDateWeek ==5 || firstDateWeek ==3 || firstDateWeek ==4 ){
|
|
|
+ calendar1.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY);
|
|
|
+ startDate = DateUtils.addDay(calendar1.getTime(),1);
|
|
|
+ }else{
|
|
|
+ calendar1.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
|
|
|
+ startDate = calendar1.getTime();
|
|
|
+ }
|
|
|
+
|
|
|
+ //判断季度最后一天的时间(以周为单位,有可能是下个月,也有可能是本月的非最后一天)
|
|
|
+ Calendar calendar2 = new GregorianCalendar();
|
|
|
+ calendar2.set(Calendar.YEAR,year);
|
|
|
+ calendar2.set(Calendar.MONTH,endMonth-1);
|
|
|
+ calendar2.set(Calendar.DATE,1);
|
|
|
+ calendar2.setFirstDayOfWeek(Calendar.FRIDAY);
|
|
|
+
|
|
|
+ //如果一个季度最后一个月最后一天是周五、周六、周日,则这个月最后一周属于下个季度
|
|
|
+ calendar2.set(Calendar.DATE, calendar2.getActualMaximum(Calendar.DATE));
|
|
|
+ int lastDateWeek = calendar2.get(Calendar.DAY_OF_WEEK);
|
|
|
+ if(lastDateWeek ==1 || lastDateWeek ==7 || lastDateWeek ==6){
|
|
|
+ calendar2.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
|
|
|
+ endDate = DateUtils.addDay(calendar2.getTime(),-1);
|
|
|
+ }else{
|
|
|
+ calendar2.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY);
|
|
|
+ endDate = calendar2.getTime();
|
|
|
+ }
|
|
|
+
|
|
|
+ DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
+ quarterStartEndDateMap.put("startDate", sdf.format(startDate));
|
|
|
+ quarterStartEndDateMap.put("endDate", sdf.format(endDate));
|
|
|
+ return quarterStartEndDateMap;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void main(String[] args) throws ParseException {
|
|
|
+ //SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
|
|
|
+ //Date friDay = DateUtils.getFriday(new Date());
|
|
|
+ //Date effiCalcStart = DateUtils.addDay(friDay, -14);
|
|
|
+ //System.out.println(sdf.format(effiCalcStart));
|
|
|
+ //Date effiCalcEnd = DateUtils.addDay(friDay, -1);
|
|
|
+ //System.out.println(sdf.format(effiCalcEnd));
|
|
|
+ //
|
|
|
+ //Date effiEnd = DateUtils.addDay(friDay, -21);
|
|
|
+ //System.out.println(sdf.format(effiEnd));
|
|
|
+ //Date effiStart = DateUtils.addDay(friDay, -15);
|
|
|
+ //System.out.println(sdf.format(effiStart));
|
|
|
+
|
|
|
+ Map<String,Integer> map1 = DateUtils.getYearQuarter(DateUtils.parseDate("2020-04-01","yyyy-MM-dd"));
|
|
|
+
|
|
|
+ Map<String,String> map2 = DateUtils.quarterStartEndDate(2019,1);
|
|
|
+
|
|
|
+ for(String key:map2.keySet()){
|
|
|
+ System.out.println(key + ":" + map2.get(key));
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+
|