任务卡_03-Java核心类库_第2节 常用类库

目录

一,快递管理训练任务

描述

代码

参考链接


一,快递管理训练任务

描述

某公司软件开发工程师孙工,作息规律为上三天班,休息一天,经常不确定休 息日是否周末,为此,请你开发一个程序,当孙工输入年及月,以日历方式显示对 应月份的休息日,用中括号进行标记.同时,统计出本月有几天休息,轮到周末休 息有几天.(注:首次休息日是 2020 年 2 月 2 日)

1. 获得输入数据:年,月 

2. 通过计算进行展示 

3. 同步输出统计信息 

4. 程序回到下一次的输入数据状态

代码

package com.kaikeba;

import java.math.BigDecimal;
import java.util.*;
import java.util.regex.Pattern;

public class Demo1 {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();              // 获得Calendar对象
        int year = 0, month = 0;                            // 收集用户输入的年份和月份
        int restYear = 2020, restMon = 2, restDay = 2;      // 设定休息日
        boolean flag = false;                               // 判断输入是否正确
        Scanner input = new Scanner(System.in);

        // 获得合法的年份
        System.out.println("请输入年:");
        do {
            String s = input.nextLine();
            if(isInteger(s)){                               // 是整数
                year = Integer.parseInt(s);                 // 字符串转换为整型
                break;
            }
            System.out.println("年份输入有误,请重新输入:");
        }while (!flag);
        System.out.println("请输入月:");

        // 获得合法的月份
        do {
            String s = input.nextLine();
            if(isInteger(s)){                               // 是整数
                month = Integer.parseInt(s);                // 字符串转换为整型
                if(month >= 1 && month <= 12){              // 月份合理
                    break;
                }
            }
            System.out.println("月份输入有误,请重新输入:");
        }while (!flag);

        // 获得用户输入日期对应的信息:
        // 该月第一天对应星期几,该月有几天,日期对应的Date对象(用于获取格林威治时间毫秒数,计算与休息日相差的天数)
        cal.set(Calendar.YEAR, year);                       // 设置用户输入的年份
        cal.set(Calendar.MONDAY, month - 1);                // 设置用户输入的月份
        cal.set(Calendar.DATE, 1);                          // 设置日期为1
        int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK) - 1;  // 当前日期是该周的第几天
        int maxDayOfMonth = cal.getActualMaximum(Calendar.DAY_OF_MONTH);    // 该月的最大天数
        Date userInputDate = cal.getTime();                 // 获取用户输入的日期对应的Date对象

        // 获得设定的休息日期对应的信息:
        // 日期对应的Date对象(用于获取格林威治时间毫秒数,计算与休息日相差的天数)
        cal.set(Calendar.YEAR, restYear);                   // 设置休息的年份
        cal.set(Calendar.MONDAY, restMon - 1);              // 设置休息的月份
        cal.set(Calendar.DATE, restDay);                    // 设置休息的日期
        Date restDayDate = cal.getTime();                   // 获取休息的日期对应的Date对象

        int diffOfDays = (int) (userInputDate.getTime() - restDayDate.getTime()) / 1000 / 60 / 60 / 24; // 当前日期与休息日期相隔天数
        int restDays = 0, restDaysInWeek = 0;               // 休息天数 周末休息的天数

        System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
        for(int i = 0; i < dayOfWeek; i++){
            System.out.printf("%-8s", "");                  // 8个字符左对齐 java中也可以用printf函数!
        }
        for(int i = 1; i <= maxDayOfMonth; i++){
            if(diffOfDays % 4 == 0){                        // 休息日
                System.out.printf("%-8s", "[" + i + "]");
                restDays++;
                if(dayOfWeek == 0 || dayOfWeek == 6){       // 周末休息
                    restDaysInWeek++;
                }
            }else {
                System.out.printf("%-8s", i);               // 工作日
            }
            dayOfWeek++;
            if(dayOfWeek % 7 == 0){                         // 一周结束,需要换行
                dayOfWeek = 0;
                System.out.println();
            }
            diffOfDays++;
        }
        System.out.println();
        System.out.println("本月休息天数有:" + restDays +"天");
        System.out.println("本月轮到周末休息天数是"+ restDaysInWeek + "天");
    }

    /*方法二:推荐,速度最快
     * 判断是否为整数
     * @param str 传入的字符串
     * @return 是整数返回true,否则返回false
     */

    public static boolean isInteger(String str) {
        Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
        return pattern.matcher(str).matches();
    }
}

参考链接

@辣辣写代码_nanaProgrammer【Java Calendar类 练习题:为孙工找到当月休息日】

1,获得字符串对齐的灵感,Java也可以使用printf函数。

  • System.out.printf("%-8s", "");                  // 8个字符左对齐

2,由于平台不同IDEA和Eclipse中的\t表示格式不同:

  • Eclipse(补全当前字符串长度到8的整数倍,补齐后长度为8*k个空格的长度);
  • IDEA(补全当前字符串长度到4的整数倍,补齐后长度为4*k个空格的长度);

@&再见萤火虫&【03-Java核心类库】

关于Date和Calendar类的使用,可以参考这里;


章节汇总在这里(づ ̄3 ̄)づ╭❤~@&再见萤火虫&【03-Java核心类库】


对学习Java感兴趣的同学欢迎加入QQ学习交流群:1126298731

有问题欢迎提问,大家一起在学习Java的路上打怪升级!(o゜▽゜)o☆[BINGO!]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值