休息日安排

需求
某护士小花,作息规律为上二天班,休息一天,经常不确定休息日是否是周末(注:首次休息日是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() + "周天");
                    }
                }
            }
        }
    }
}

代码写的比较勉强,很多地方肯定还有更好的方法,小左在这里虚心地请各位道友指教。

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值