java 自然周_一月分四周的JAVA实现方法

public classone_month_four_week {public static voidmain(String[] args) {

int year = 2017;int month = 10;//改成你要的年月,运行即可查看结果

Calendar cal=Calendar.getInstance();

cal.set(Calendar.YEAR, year);

cal.set(Calendar.MONTH, month- 1);//-1才正确

int days = cal.getActualMaximum(Calendar.DATE);//Calendar.DAY_OF_MONTH也对

System.out.println("首先,计算这个月有" + days + "天");

String[] weekDays= { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };//国外一周起始

int[] chinaWeek = { 7, 1, 2, 3, 4, 5, 6 };//对应成中国一周的第几天

SimpleDateFormat str_date_format= new SimpleDateFormat("yyyy-MM-dd");

List monthDay = new ArrayList<>();int week_of_month = 1;for (int i = 1; i <= days; i++) {

EachDayAttr oneDay= newEachDayAttr();

oneDay.setWhich(i);//计算这个月的每一天,对应星期几

String dayStr = year + "-" + month + "-" +i;

Date daysDate= null;try{

daysDate=str_date_format.parse(dayStr);

}catch(ParseException e) {

e.printStackTrace();

}

cal.setTime(daysDate);int w1 = cal.get(Calendar.DAY_OF_WEEK) - 1; //指示一个星期中的第几天

int which_day_chinaWeek =chinaWeek[w1];

System.out.println("该月的第"+ i +"天,该星期(外国习惯)的第"+ w1 +"天:"+ weekDays[w1] +">>对应中国周的第"+ which_day_chinaWeek +"天!");//关键:该月每一天对应,中国周里面的第几周

if (which_day_chinaWeek == 1 && monthDay.size() > 0) {//星期一,中国习惯里新的一周的开始

week_of_month++;

oneDay.setWeek(week_of_month);

}else{

oneDay.setWeek(week_of_month);

}

monthDay.add(oneDay);

}//分组:按中国习惯分组

Map> weekGroup = new TreeMap<>();for(EachDayAttr oneDay : monthDay) {if(weekGroup.containsKey(oneDay.getWeek())) {

weekGroup.get(oneDay.getWeek()).add(oneDay);

}else{

List addGroup = new ArrayList<>();

addGroup.add(oneDay);

weekGroup.put(oneDay.getWeek(), addGroup);

}

}//再分组:合并成四周

if (weekGroup.size() == 4) {//weekGroup不做处理

} else if (weekGroup.size() == 5) {if (weekGroup.get(1).size() < weekGroup.get(5).size()) {

weekGroup.get(2).addAll(weekGroup.get(1));

weekGroup.remove(1);

}else{

weekGroup.get(4).addAll(weekGroup.get(5));

weekGroup.remove(5);

}

}else if (weekGroup.size() == 6) {

weekGroup.get(2).addAll(weekGroup.get(1));

weekGroup.get(5).addAll(weekGroup.get(6));

weekGroup.remove(1);

weekGroup.remove(6);

}//吧weekGroup按天数排序,取最小为开始日期,最大为结束日期即可

for (Entry>entry : weekGroup.entrySet()) {

Collections.sort(entry.getValue(),new Comparator() {public intcompare(EachDayAttr day1, EachDayAttr day2) {return day1.getWhich() -day2.getWhich();

}

});

}//最后从分好组、排好序的weekGroup中取值封装//weekGroup-->entry中健为整数,而值为list>集合

Map rtResult = new HashMap<>();int signWeek = 1;for (Entry>entry : weekGroup.entrySet()) {

String[] addResult= new String[2];int firstDay = entry.getValue().get(0).getWhich();int lastDay = entry.getValue().get(entry.getValue().size() - 1).getWhich();

addResult[0] = year + "-" + month + "-" +firstDay;

addResult[1] = year + "-" + month + "-" +lastDay;

rtResult.put(signWeek, addResult);

signWeek++;

}//至此,输出看下结果

for (Entryentry : rtResult.entrySet()) {

System.out.println("----该月第"+ entry.getKey() +"周-----");

System.out.println("开始日期:" + entry.getValue()[0]);

System.out.println("结束日期:" + entry.getValue()[1]);

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值