需求:
某护士小花,作息规律为上二天班,休息一天,经常不确定休息日是否是周末(注:首次休息日是2022年2月3日)。
具体功能点的要求如下
1、请你开发一个程序,当小花输入年以及月后,立即显示出该月份的休息日详情。
示范(注意:示范信息重点在于参考格式,结果不一定是准确的,请自行确保计算结果正确性):
**请小花输入查询的月份(月份必须是2022年2月之后的月份): 2023-05 。
形如2023-05-01[休息] 2023-05-02 2023-05-03 2023-05-04[休息] …
2、显示出该月份哪些休息日是周六或周日(请依次列出具体的日期和其星期信息)。
将每一天作为一个对象来看(先看下面那个代码块)
package day03_the_third;
import java.time.LocalDate;
public class Day {
private LocalDate date;
private int flag = 1; //0为休息,1为上班 (默认为上班)
public Day() {
}
public Day(LocalDate date) {
this.date = date;
}
public Day(LocalDate date, int flag) {
this.date = date;
this.flag = flag;
}
public LocalDate getDate() {
return date;
}
public void setDate(LocalDate date) {
this.date = date;
}
public int getFlag() {
return flag;
}
public void setFlag(int flag) {
this.flag = flag;
}
}
详细代码如下
package day03_the_third;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAccessor;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Scanner;
import java.util.logging.SimpleFormatter;
public class Test {
public static void main(String[] args) throws ParseException {
//1、拿到初始时间
LocalDate startDate = LocalDate.of(2022,2,3);
//2、让用户输入要查询的时间
Scanner sc = new Scanner(System.in);
System.out.println("请输入查询的时间,以方便为您计算出您的日程计划(形如2022-02,只支持比这个时间以来的日子):");
//灵活使用,我们可以先自动添加上天数
String queryDateString = sc.next()+"-01";
//将字符串转化为yyyy-MM的形式
LocalDate queryDate = LocalDate.parse(queryDateString);
//得到要查询的月份的最后一天
LocalDate lastOfMonth = queryDate.plusMonths(1).minusDays(1);
//3、拿到从起始日子到最后一天的全部日子,以进行标记哪天是休息日 (将每一天当作一个对象)
List<Day> alldays = new ArrayList<>(); //多态写法
List<Day> days = new ArrayList<>(); //用来存储休息日
//从开始日子一直遍历到查询日期的最后一天
while(startDate.isBefore(lastOfMonth.plusDays(1))){
Day day = new Day(startDate);
alldays.add(day);
//往后进行遍历
startDate = startDate.plusDays(1);
}
//2022-02-03是休息的第一天 进行遍历将所有休息日加入days集合
for (int i = 0; i < alldays.size(); i+=3) {
alldays.get(i).setFlag(0);
days.add(alldays.get(i));
}
//4、遍历打印出查询月份的休息安排
//得到前一个月的最后一天,以及下个月的第一天,用于遍历约束
LocalDate theLastDayOftheLastMonth = queryDate.minusDays(1);
LocalDate theFirstOfTheLastMonth = queryDate.plusMonths(1);
for (Day day : alldays) {
//仅在要查询的月份进行遍历
if(day.getDate().isAfter(theLastDayOftheLastMonth) && day.getDate().isBefore(theFirstOfTheLastMonth)){
if(day.getFlag() == 0){
System.out.println(day.getDate() + "[休息]");
}else{
System.out.println(day.getDate());
}
}
}
//5、打印出本月休息日是周末的情况
for (Day day : alldays) {
//仅在要查询的月份进行遍历
if(day.getDate().isAfter(theLastDayOftheLastMonth) && day.getDate().isBefore(theFirstOfTheLastMonth)){
if(day.getFlag() == 0 && (day.getDate().getDayOfWeek().getValue() == 6 || day.getDate().getDayOfWeek().getValue() == 7)){
if(day.getDate().getDayOfWeek().getValue() == 6){
System.out.println(day.getDate() + "周六");
}else{
System.out.println(day.getDate() + "周天");
}
}
}
}
}
}
代码写的比较勉强,很多地方肯定还有更好的方法,小左在这里虚心地请各位道友指教。