Java基础用Date类编写万年历

简介: Java基础用Date类编写万年历

万年历


1.提醒用户键盘录入一个指定格式的日期 yyyy-MM-dd


2.如果用户录入的日期格式不符合要求,提示录入格式有误重新录入


提示用户:请输入一个yyyy-02-28格式的日期

String date = “4个数字-2个数字-2个数字”;


3.展示用户录入的该天的信息

星期几

本周是本月第几周

是本年第几周

是本年的第几天

本年的生肖

本年是平年还是闰年


思路:


符合要求的日期字符串

1.必须要求字符串按照 “-” 切割,分为三部分


2.每一部分的字符串的长度有限制


第一部分 年 四位长度字符串

第二部分 月 两位长度字符串

第三部分 日 两位长度字符串

3.第一部分年,4位数字,每一位数字的值都在 0 - 9之间


4.第二部分 月 MM


int num = Inter.parseInt(String s) 如果用户录入的月份不是数字,抛出异常,让程序在异常产生位置停止


第一个M 0 1

第二个M 0 - 9

如果上面两个条件都满足,证明这个字符串就是一个数字字符串,将字符串转为一个数字

int month = Inter.parseInt(String s)

数字介于1-12之间,否则格式有误


5.第三部分 日 dd


同上,日dd,也不能直接进行parseInt,因为非数字字符串会导致异常


第一个d: 0 - 3

第二个d: 0 - 9

int day = Inter.parseInt(String s)


数字介于1-31之间,否则格式有误


6.判断在4 6 9 11这四个月中,天数不能为31

int[] months = {4,6,9,11};


判断月份在数组中包含,且天数为31了,这是不符合规范的


7.对于2月份的处理


平年2月份 28天

闰年2月份 29天

if(【1】能被4整除&&不能被100整除。

||

【2】能被400整除){

当月份为2时,日必须在 1 - 29,不在此范围之内,不符合规范

}else{

当月份为2时,日必须在 1 - 28,不在此范围之内,不符合规范

}


展示用户录入的该天的信息

“2020-06-07”


String -> Date 解析,提供一个模板,按照这个模板将字符串解析为一个Date对象

Calendar.setTime(Date date)


星期几 *

日 1

一 2

六 7


String[] arr {“”,“周日”,“周一”,…“周六”};

将数组的元素取出


本周是本月第几周

是本年第几周

是本年的第几天

本年的生肖 *

2021 牛

公元后第一个牛年,是公元几年

2021 % 12


11年是羊年

10年是马年

9年是蛇年

8年是龙年

7年是兔年

6年是虎年

5年是牛年

4年是鼠年

3年是猪年

2年是狗年

1年是鸡年

0年是猴年


任意一年 % 12 看余数,余数为几,就是哪一年


本年是平年还是闰年


实现代码01:Date类


public class Date {
    public static void main(String[] args) throws ParseException {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入格式为yyyy-MM-dd的日期:");
        String str;
        while(true){
            str = sc.next();
            boolean flag = checkDateStr(str);
            if(flag){
                break;
            }else{
                System.out.println("你输入的格式有误,请重新输入!");
            }
        }
        MyCalendar calendarStr = getCalendarStr(str);
        System.out.println(calendarStr);
    }
    public static boolean checkDateStr(String dateStr){
        //1.必须要求字符串按照 "-" 切割
        String[] ymdArr = dateStr.split("-");
        //2、判断切割字符串是否为三段
        if(ymdArr.length != 3){
            return false;
        }
        //3、判断每个分割字符串的长度
        if(ymdArr[0].length() != 4 || ymdArr[1].length() != 2 || ymdArr[2].length() != 2){
            return false;
        }
        //4、判断年的四个数字,每个数字都在0-9范围内
        for(int i=0;i< ymdArr[0].length();i++) {
            char c = ymdArr[0].charAt(i);
            if (c < '0' || c > '9') {
                return false;
            }
        }
        //5、判断月的第一个字符范围在0-1
        if (ymdArr[1].charAt(0) < '0' || ymdArr[1].charAt(0) > '1') {
            return false;
        }
        //6、判断月的第二个字符范围在0-9
        if (ymdArr[1].charAt(1) < '0' || ymdArr[1].charAt(1) > '9') {
            return false;
        }
        //8、证明月字符串就是一个数字字符串,将字符串转为一个数字,并且范围在1-12之间
        int month = Integer.parseInt(ymdArr[1]);
        if (month < 1 || month > 12) {
            return false;
        }
        //9、判断日字符串的第一个字符范围在0-3
        if (ymdArr[2].charAt(0) < '0' || ymdArr[2].charAt(0) > '3') {
            return false;
        }
        //10、判断日字符串的第二个字符范围在0-9
        if (ymdArr[2].charAt(1) < '0' || ymdArr[2].charAt(1) > '9') {
            return false;
        }
        //11、判断日字符串的天数不能超过31天
        int day = Integer.parseInt(ymdArr[2]);
        if (day < 1 || day > 31) {
            return false;
        }
        //12、判断在4 6 9 11这四个月中,天数不能为31
        int[] arr = {4, 6, 9, 11};
        if (existsNum(arr, month) && day == 31) {
            return false;
        }
        //13、对于2月份的处理
        //平年2月份28天
        //闰年2月份29天
        int year = Integer.parseInt(ymdArr[0]);
        if(isLeapYear(year)){
            //当月份为2时,日必须在 1 - 29,不在此范围之内,不符合规范
            if(month == 2 && (day < 1 || day > 29)){
                return false;
            }else
            if(month == 2 && (day < 1 || day >29)){
                return false;
            }
        }
        return true;
    }
    public static boolean existsNum(int[] arr,int num){
        for(int i=0;i< arr.length;i++){
            if(arr[i] == num){
                return true;
            }
        }
        return false;
    }
    public static boolean isLeapYear(int year){
        if(year % 4 == 0 && year % 100 != 0){
            return true;
        }else if(year % 400 == 0){
            return true;
        }else{
            return false;
        }
    }
    public static MyCalendar getCalendarStr(String dataStr) throws ParseException {
        //自定义一个日期格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        java.util.Date date = sdf.parse(dataStr);
        //以当前Date对象设置成Calendar
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        MyCalendar myCalendar = new MyCalendar();
        myCalendar.setYear(calendar.get(Calendar.YEAR));
        myCalendar.setMonth(calendar.get(Calendar.MONTH) + 1);
        myCalendar.setDay(calendar.get(Calendar.DAY_OF_MONTH));
        int week = calendar.get(Calendar.DAY_OF_WEEK);
        myCalendar.setWeek(getWeekStr(week));// 1 - 7  周日 周一 ~ 周六
        myCalendar.setWeekOfMonth(calendar.get(Calendar.WEEK_OF_MONTH));
        myCalendar.setWeeOfYear(calendar.get(Calendar.WEEK_OF_YEAR));
        myCalendar.setDayOfYear(calendar.get(Calendar.DAY_OF_YEAR));
        myCalendar.setAnimal(getAnimal(calendar.get(Calendar.YEAR)));
        myCalendar.setYearType(isLeapYear(calendar.get(Calendar.YEAR)) == true ? "闰年" : "平年");
        return myCalendar;
    }
    public static String getWeekStr(int week){
        String[] weeks = {"","周日","周一","周二","周三","周四","周五","周六",};
        return weeks[week];
    }
    public static String getAnimal(int year){
        int num = year % 12;
        String animal = "";
        switch(num){
            case 0:
                animal = "猴年";
                break;
            case 1:
                animal = "鸡年";
                break;
            case 2:
                animal = "狗年";
                break;
            case 3:
                animal = "猪年";
                break;
            case 4:
                animal = "鼠年";
                break;
            case 5:
                animal = "牛年";
                break;
            case 6:
                animal = "虎年";
                break;
            case 7:
                animal = "兔年";
                break;
            case 8:
                animal = "龙年";
                break;
            case 9:
                animal = "蛇年";
                break;
            case 10:
                animal = "马";
                break;
            case 11:
                animal = "羊";
                break;
        }
        return animal;
    }
}


实现代码02:MyCalendar类


/*
* //对象用于封装日历所有信息
* */
public class MyCalendar {
    private int year;
    private int month;
    private int day;
    private String week;//本周
    private int weekOfMonth;//是本月第几周
    private int weeOfYear;//是本年第几周
    private int dayOfYear;//是本年的第几天
    private String animal;//本年的生肖
    private String yearType;//本年是平年还是闰年
    public int getYear() {
        return year;
    }
    public void setYear(int year) {
        this.year = year;
    }
    public int getMonth() {
        return month;
    }
    public void setMonth(int month) {
        this.month = month;
    }
    public int getDay() {
        return day;
    }
    public void setDay(int day) {
        this.day = day;
    }
    public String getWeek() {
        return week;
    }
    public  void setWeek(String week) {
        this.week = week;
    }
    public int getWeekOfMonth() {
        return weekOfMonth;
    }
    public void setWeekOfMonth(int weekOfMonth) {
        this.weekOfMonth = weekOfMonth;
    }
    public int getWeeOfYear() {
        return weeOfYear;
    }
    public void setWeeOfYear(int weeOfYear) {
        this.weeOfYear = weeOfYear;
    }
    public int getDayOfYear() {
        return dayOfYear;
    }
    public void setDayOfYear(int dayOfYear) {
        this.dayOfYear = dayOfYear;
    }
    public String getAnimal() {
        return animal;
    }
    public void setAnimal(String animal) {
        this.animal = animal;
    }
    public String getYearType() {
        return yearType;
    }
    public void setYearType(String yearType) {
        this.yearType = yearType;
    }
    public MyCalendar() {
    }
    public MyCalendar(int year, int month, int day, String week, int weekOfMonth, int weeOfYear, int dayOfYear, String animal, String yearType) {
        this.year = year;
        this.month = month;
        this.day = day;
        this.week = week;
        this.weekOfMonth = weekOfMonth;
        this.weeOfYear = weeOfYear;
        this.dayOfYear = dayOfYear;
        this.animal = animal;
        this.yearType = yearType;
    }
    @Override
    public String toString() {
        return "MyCalendar{" +
                "year=" + year +
                ", month=" + month +
                ", day=" + day +
                ", week='" + week + '\'' +
                ", weekOfMonth=" + weekOfMonth +
                ", weeOfYear=" + weeOfYear +
                ", dayOfYear=" + dayOfYear +
                ", animal='" + animal + '\'' +
                ", yearType='" + yearType + '\'' +
                '}';
    }
}
相关文章
|
1月前
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。HashSet基于哈希表实现,提供高效的元素操作;TreeSet则通过红黑树实现元素的自然排序,适合需要有序访问的场景。本文通过示例代码详细介绍了两者的特性和应用场景。
40 6
|
4天前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
|
22天前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
42 17
|
14天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
18天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
65 4
|
18天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
40 2
|
23天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
27天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
27天前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
|
27天前
|
存储 Java 编译器
java wrapper是什么类
【10月更文挑战第16天】
31 3
下一篇
无影云桌面