Java基础之构造日期时间

发布于:2022-12-08 ⋅ 阅读:(778) ⋅ 点赞:(0)

1 构造日期

1.1 构造方法

1.2 只读权限

1.3 检查合法性

1.4 判断闰年

1.5 根据月份取边界

1.6 实现向前一天、向后一天操作

1.7 返回格式为字符串类型,具体为2021-12-08

1.8 实现计算两个日期相差的天数

2 构造时间

2.1 构造方法

2.2 实现下一秒的操作

3 将时间和日期整体操作

3.1 构造方法

3.2 特殊处理


1 构造日期

1.1 构造方法

    private int year;
    private int month;
    private int day;
    public Date(Date date) {
        this.year = date.year;
        this.month = date.month;
        this.day = date.day;
    }
    public Date(int year, int month, int day) {
        if (!checkYear(year)) {
            throw new RuntimeException("year必须在[1000,3000]内,year= " + year);
        }
        if (!checkMonth(month)) {
            throw new RuntimeException("month必须在[1,12]内,month = " + month);
        }
        if (!checkDay(year, month, day)) {
            throw new RuntimeException("day必须符合范围");
        }
        this.year = year;
        this.month = month;
        this.day = day;
    }

1.2 只读权限

    public int getYear() {
        return year;
    }

    public int getMonth() {
        return month;
    }

    public int getDay() {
        return day;
    }

1.3 检查合法性

    private boolean checkDay(int year, int month, int day) {
        if (month != 2) {
            int i = month - 1;
            return day >= 1 && day <= DAY_OF_MONTH[i];
        }
        if (isLeapYear(year)) {
            return day >= 1 && day <= 29;
        }
        return day >= 1 && day <= 28;
    }
    private boolean checkMonth(int month) {
        return month >= 1 && month <= 12;
    }

    private boolean checkYear(int year) {
        return year >= 1000 && year <= 3000;
    }

1.4 判断闰年

    private static boolean isLeapYear(int year) {
        if (year % 400 == 0) {
            return true;
        }
        return year % 4 == 0 && year % 100 != 0;
    }

1.5 根据月份取边界

    private static int 根据月取边界(int year, int month) {
        if (month == 2) {
            return isLeapYear(year) ? 29 : 28;
        } else {
            int m = month - 1;
            return DAY_OF_MONTH[m];
        }
    }

    private static final int[] DAY_OF_MONTH = {
            31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
    };

1.6 实现向前一天、向后一天操作

    public void 往前一天() {
        day--;
        if (day >= 1) {
            return;
        }
        month--;
        if (month == 0) {
            year--;
            month = 12;
        }
        day = 根据月取边界(year, month);
    }

    public void 往后一天() {
        day++;
        int dayBound = 根据月取边界(year, month);
        if (day <= dayBound) {
            return;
        }
        month++;
        day = 1;
        if (month <= 12) {
            return;
        }
        year++;
        month = 1;
    }

1.7 返回格式为字符串类型,具体为2021-12-08

    public String toString() {
        return String.format("%04d-%02d-%02d", year, month, day);
    }

1.8 实现计算两个日期相差的天数

    public static int 相差天数(Date d1, Date d2) {
        boolean sign = true;
        //Date tmp = new Date(d1.getYear(),d1.getMonth(),d1.getDay());
        if(compare(d1,d2) > 0){
            Date d = d1;
            d1 = d2;
            d2 = d;
            sign = false;
        }
        Date tmp = new Date(d1);
        int count = 0;
        while (!equals(tmp, d2)) {
            tmp.往后一天();
            count++;
        }
        return sign ? count: -count;
    }

    private static boolean equals(Date d1, Date d2) {
        return d1.getYear() == d2.getYear()
                && d1.getMonth() == d2.getMonth()
                && d1.getDay() == d2.getDay();
    }
    private static int compare(Date d1,Date d2){
        if(d1.getYear() != d2.getYear()){
            return d1.getYear() - d2.getYear();
        }
        if(d1.getMonth() !=d2.getMonth()){
            return d1.getMonth() - d2.getMonth();
        }
            return d1.getDay() - d2.getDay();
    }

2 构造时间

2.1 构造方法

    private int minute;
    private int hour;
    private int second;
    public Time(Time time){
        this.hour = time.hour;
        this.minute = time.minute;
        this.second = time.second;
    }

    public Time(int hour, int minute, int second) {
        this.hour = hour;
        this.minute = minute;
        this.second = second;
    }

2.2 实现下一秒的操作

    public boolean 下一秒() {
        second++;
        if (second < 60) {
            return false;
        }
        minute++;
        second = 0;
        if (minute < 60) {
            return false;
        }
        hour++;
        minute = 0;
        if (hour < 24) {
            return false;
        }
        hour = 0;
        return true;
    }

3 将时间和日期整体操作

3.1 构造方法

    private Date date;
    private Time time;
    public DateTime(int year,int month,int day,int hour,int minute,int second){
        date = new Date(year,month,day);
        time = new Time(hour,minute,second);
    }
    public DateTime(){

    }

3.2 特殊处理

    public void 下一秒(){
        if(time.下一秒()){
            date.往后一天();
        }
    }
    public String toString(){
        return date.toString()+ " "+ time.toString();
    }

以上是构造日期时间的部分操作,仅供参考。之后将讲述对日期时间类的拷贝方式,详见Java基础之深浅拷贝(DateTime)。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到