数据
/**
* 节日是某月的第几个星期几
* 例如:0637 父亲节 06是6月,3是第三个星期, 7是星期日。0351其中1是星期一
* 注意:如果是最后一个星期天,表示为-17,-1是星期数,7是星期日
*/
private static String[] wFtv = new String[]{
"黑人节 0117",
"世界麻风日 01-17",
"日本成人节 0121",
"中小学安全教育日 0351",
"母亲节 0527",
"全国助残日 0537",
"父亲节 0637",
"合作节 0716",
"被奴役国家周 0737",
"国际聋人节 0947",
"国际住房日 1011 ",
"感恩节 1144"};
思路:
本周几【从星期天开始计算】,如果今天星期二,那么返回 那么周天就是1,周六就是7
A:当前日期是周几,周二就返回2,周天就返回7
- A = (instance.get(Calendar.DAY_OF_WEEK)-1); if (A== 0) A= 7;//由于java的DAY_OF_WEEK是从周天开始算的,周天是1,周六是7,所以等于周天的时候调整值
B=要求的日期时周几,例如“母亲节 0527”中的0,0代表星期天;B=0,例如”国际和平日 0932“中的2,2代表星期2;
如果是求本月的第几周的星期几:
C=A-B。
第一步:求出两个日期之间星期的距离
如果C>0 ,假如A是周五,B是周三,表示他们俩之间的距离是(7-A)+B
如果C<0 ,假如A是周三,B是周五,表示他们俩之间的距离是B-A
第二步:加上第几个星期的天数,设置
给月初的日期加上:【C+7*(第几个星期数-1)】
如果是求本月的倒数第几周的星期几:
C=A-B。
第一步:求出两个日期之间星期的距离
如果C>0 ,假如A是周五,B是周三,表示他们俩之间的距离是B-A
如果C<0 ,假如A是周三,B是周五,表示他们俩之间的距离是(7-B)+A
第二步:加上第几个星期的天数,设置
给月末的日期减去:【C+7*(第几个星期数-1)】
代码:
Map<String, String> wFtvMap = Arrays.stream(wFtv).collect(Collectors.toMap(k -> k.split(" ")[0], k -> k.split(" ")[1]));
String dateNum = "";
if(wFtvMap.containsKey(input)){
System.out.println(getDayInWeek(wFtvMap.get(input)));
}
/**
* 获取一个月中第几个周的第几天
*/
private static String getDayInWeek(String dateNum){
int month = Integer.valueOf(dateNum.substring(0,2));
int order = Integer.valueOf(dateNum.substring(2,dateNum.length()-1));
int weekNum = Integer.valueOf(dateNum.substring(dateNum.length()-1,dateNum.length()));
//设置月份:注意,设置月份的时候,设置如果是2,实际是3月份
instance.set(instance.get(Calendar.YEAR),month-1,instance.get(Calendar.DATE));
int distance = 0;
if(order>0 && order<6){//第几个星期
instance.set(Calendar.DAY_OF_MONTH, 1);
int whatWeekNow = (instance.get(Calendar.DAY_OF_WEEK)-1);
if (whatWeekNow == 0) whatWeekNow = 7;//由于java的DAY_OF_WEEK是从周天开始算的,周天是1,周六是7,所以等于周天的时候调整值
int diff = whatWeekNow-weekNum;//月初处于本月第几周-设置的日期是周几
if(diff>0){
distance = 7-whatWeekNow+weekNum;
}else if(diff<0){
distance = weekNum - whatWeekNow;
}
instance.add(Calendar.DAY_OF_MONTH,distance+(order-1)*7);
}else if (order<0){//获取倒数第几个星期
instance.add(Calendar.MONTH, 1);
instance.set(Calendar.DAY_OF_MONTH, 1);
instance.add(Calendar.DAY_OF_MONTH, -1);//本月最后一天
int whatWeekNow = (instance.get(Calendar.DAY_OF_WEEK)-1);
if (whatWeekNow == 0) whatWeekNow = 7;//由于java的DAY_OF_WEEK是从周天开始算的,周天是1,周六是7,所以等于周天的时候调整值
int diff = whatWeekNow-weekNum;//月末处于本月第几周-设置的日期是周几
if(diff>0){
distance = weekNum-whatWeekNow;
}else{
distance = (7-weekNum)+whatWeekNow;
}
instance.add(Calendar.DAY_OF_MONTH,-distance+(order+1)*7);
}else{
throw new StringIndexOutOfBoundsException("当月的星期数不能大于5");
}
return sdf.format(instance.getTime());
}
public static void main(String[] args) {
System.err.println(getDayInWeek("06-17"));//2021-06-27
System.err.println(getDayInWeek("0521"));//2021-05-10
System.err.println(getDayInWeek("04-36"));//2021-04-10
System.err.println(getDayInWeek("0534"));//2021-05-20
}