Day07-Java进阶-JDK7(时间类&日历类) & JDK8(日历类&时间格式类)

1. JDK7(时间类&日历类)

1.1 时间API

8版本前后的时间API对比

1.1.1 Date类

package com.itheima.date;

import java.util.Date;

public class DateDemo {
    /*
        Date类: 表示时间的类

        1. 构造方法:

            public Date() : 将当前时间, 封装为Date日期对象
            public Date(long time) : 把时间毫秒值转换成Date日期对象

        2. 常见方法 :

            public long getTime() : 返回从1970年1月1日 00:00:00走到此刻的总的毫秒数
            public void setTime(long time) : 设置日期对象的时间为当前时间毫秒值对应的时间
     */
    public static void main(String[] args) {
        // 将当前时间, 封装为Date日期对象
        Date d1 = new Date();
        System.out.println(d1);

        // 把时间毫秒值转换成Date日期对象
        Date d2 = new Date(1000L);
        System.out.println(d2);

        System.out.println(d1.getTime());
        System.out.println(d2.getTime());

        System.out.println("--------------------");

        Date d3 = new Date();
        d3.setTime(0L);
        System.out.println(d3);
    }
}

1.1.2 SimpleDateFormat类

package com.itheima.format;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class SimpleDateFormatDemo {
    /*
        SimpleDateFormat类 : 用于日期格式化

        1. 构造方法:

            public SimpleDateFormat() : 创建一个日期格式化对象, 使用 [默认模式]
            public SimpleDateFormat(String pattern) : 创建一个日期格式化对象, [手动指定模式]

        2. 常用方法 :

            public final String format(Date date) : 将日期对象, 转换为字符串
            public final Date parse(String sourse) : 将日期字符串, 解析为日期对象
     */
    public static void main(String[] args) throws ParseException {
        // 创建一个日期格式化对象, 使用 [默认模式]
        //SimpleDateFormat simpleDateFormat = new SimpleDateFormat();

        // 创建一个日期格式化对象, [手动指定模式]
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日");

        // 创建Date对象, 封装此刻的时间
        Date date = new Date();

        // 将日期对象, 转换为字符串
        String result = simpleDateFormat.format(date);

        System.out.println(result);

        System.out.println("-----------------------------");

        String today = "2024年4月19日";
        Date date1 = simpleDateFormat.parse(today);

        System.out.println(date1);
    }
}

1.1.3 计算生日至今的天数

package com.itheima.test;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

public class DateTest1 {
    /*
        需求: 计算你来到了这个世界多少天

        分析:
                1. 键盘录入用户的生日 (日期字符串)
                2. 创建SimpleDateFormat对象, 指定模式, 对于将日期字符串解析为Date日期对象 (birthdayDate)
                3. 创建Date日期对象, 封装此刻的时间 (todayDate)
                4. long time = todayDate.getTime() - birthdayDate.getTime();
                5. 将毫秒值转换为天的单位

                    time / 1000 / 60 / 60 / 24;
     */
    public static void main(String[] args) throws ParseException {
        // 1. 键盘录入用户的生日 (日期字符串)
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入您的生日: xxxx年xx月xx日");
        String birthday = sc.nextLine();

        // 2. 创建SimpleDateFormat对象, 指定模式, 对于将日期字符串解析为Date日期对象 (birthdayDate)
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日");
        Date birthdayDate = simpleDateFormat.parse(birthday);

        // 3. 创建Date日期对象, 封装此刻的时间 (todayDate)
        Date todayDate = new Date();

        // 4. long time = todayDate.getTime() - birthdayDate.getTime()
        long time = todayDate.getTime() - birthdayDate.getTime();

        // 5. 将毫秒值转换为天的单位并打印
        System.out.println(time / 1000 / 60 / 60 / 24);
    }

}

1.2 Calendar 类

package com.itheima.calendar;

import java.util.Calendar;

public class CalendarDemo {
    /*
        Calendar : 代表的是系统此刻时间对应的日历, 通过它可以单独获取, 修改时间中的年、月、日、时、分、秒等

        1. 创建对象 :
                public static Calendar getInstance() : 获取当前时间的日历对象
        2. 常用方法 :
                public int get(int field) : 取日历中的某个字段信息

                                get方法的参数 : Calendar类中的静态变量

                                    Calendar.YEAR : 获取年份信息
                                    Calendar.MONTH : 月份是0~11, 记得做+1操作
                                    Calendar.DAY_OF_MONTH :获取日
                                    Calendar.DAY_OF_WEEK : 获取星期, 获取星期的时候, 需要提前设计一个数组
                                    Calendar.DAY_OF_YEAR : 获取一年当中的第几天

                public void set(int field,int value) : 修改日历的某个字段信息
                public void add(int field,int amount) : 为某个字段增加/减少指定的值
     */
    public static void main(String[] args) {

        Calendar c = Calendar.getInstance();

        c.set(Calendar.YEAR,2022);

        System.out.println(c.get(Calendar.YEAR));

    }

    private static void getMethod() {
        // Calendar c : 抽象类
        // Calendar.getInstance() : 获取的是子类对象
        // 1. 获取当前时间的日历对象
        Calendar c = Calendar.getInstance();

        // 2. 调用get方法, 获取指定字段的信息
        int year = c.get(Calendar.YEAR);
        System.out.println(year);   // 2024

        // 注意Calendar类的月份是 0~11, 想要获取常规的月份, 需要对结果 + 1操作
        int month = c.get(Calendar.MONTH);
        System.out.println(month + 1);  // 4

        int day = c.get(Calendar.DAY_OF_MONTH);
        System.out.println(day);    // 19

        // 星期: 日 一 二 三 四 五 六 (国外星期的排法)
        //      1  2  3  4  5  6  7

        char[] weeks = {' ', '日', '一', '二', '三', '四', '五', '六'};
        //               0     1    2     3    4    5     6     7

        int weekIndex = c.get(Calendar.DAY_OF_WEEK);
        System.out.println(weeks[weekIndex]);   // 五

        int dayOfYear = c.get(Calendar.DAY_OF_YEAR);
        System.out.println(dayOfYear);  // 110
    }
}

小案例

package com.itheima.test;

import java.util.Calendar;

public class CalendarTest1 {
    /*
        需求 : 使用程序判断出 2050年3月1日 是否是疯狂星期四
     */
    public static void main(String[] args) {

        // 1. 获取日期对象 (此刻的时间)
        Calendar c = Calendar.getInstance();

        // 2. 调用set方法, 将时间设置为 2050年3月1日
        c.set(2050,2,1);

        char[] weeks = {' ', '日', '一', '二', '三', '四', '五', '六'};
        //               0     1    2     3    4    5     6     7


        // 3. 获取星期
        int weekIndex = c.get(Calendar.DAY_OF_WEEK);

        if (weeks[weekIndex] == '四'){
            System.out.println("今天是疯狂星期四, 我要奢侈一把~");
        }else {
            System.out.println("今天不是疯狂星期四, 吃不起KFC");
        }
    }
}

package com.itheima.test;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;

public class CalendarTest2 {
    /*
        需求 : 键盘录入一个日期字符串, 程序输出这个日期是一年中的第多少天

                1. 使用SimpleDateFormat, 将日期字符串转换为日期对象
                2. 将日期对象, 转换为Calendar对象
                3. 调用get方法, 获取一年中的第几天
     */
    public static void main(String[] args) throws ParseException {
        // 1. 输入日期字符串
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入日期字符串: xxxx年xx月xx日");
        String dateContent = sc.nextLine();

        // 2. 使用SimpleDateFormat, 将日期字符串转换为日期对象
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日");
        Date date = simpleDateFormat.parse(dateContent);

        // 3. 将日期对象, 转换为Calendar对象
        Calendar c  = Calendar.getInstance();
        c.setTime(date);

        // 4. 调用get方法, 获取一年中的第几天
        System.out.println("是这一年当中的第"+c.get(Calendar.DAY_OF_YEAR)+"天");

    }
}

2. JDK8(日历类&时间格式类)

2.1 日历类

package com.itheima.distinction;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;

public class Test {
    public static void main(String[] args) {
        // JDK8之前 :
        // 都是可变对象, 修改后会丢失最开始的时间信息
        Date time = new Date();
        System.out.println("修改前获取时间: " + time);
        // 修改
        time.setTime(1000);
        System.out.println("修改后获取的时间:" + time);

        System.out.println("------------------------------");

        // JDK8版本之后 :
        // 都是不可变对象, 修改后会返回新的时间对象, 不会丢失最开始的时间
        LocalDateTime now = LocalDateTime.now();
        System.out.println("修改后获取的时间:" + now);

        LocalDateTime afterTime = now.withYear(2008);
        System.out.println("修改后获取时间" + afterTime);
        System.out.println("修改后获取的时间:" + now);
    }
}

package com.itheima.jdk8;

import java.time.LocalDateTime;

public class Demo {
    /*
        --------------------------------------------------------
        LocalDate、LocalTime、LocalDateTime

        对象的创建方式

        1. now() : 当前时间

        2. of() : 设置时间

        ---------------------------------------------------------
        LocalDateTime 转换LocalDate、LocalTime、LocalDateTime

        1. toLocalDate()
        2. toLocalTime()
     */
    public static void main(String[] args) {
        // 获取此刻的时间对象
        LocalDateTime now = LocalDateTime.now();
        System.out.println(now);

        System.out.println(now.getYear() + "年");
        System.out.println(now.getMonth() + "月");
        System.out.println(now.getMonthValue() + "月");
        System.out.println(now.getDayOfMonth() + "日");
        System.out.println(now.getHour() + "时");
        System.out.println(now.getMinute() + "分");
        System.out.println(now.getSecond() + "秒");
        System.out.println(now.getNano() + "纳秒");

        // 获取指定的时间对象
        LocalDateTime of = LocalDateTime.of(2008, 8, 8, 8, 8);
        System.out.println(of);

    }
}

2.2 时间格式化类

2.3 时间类

2.4 工具类

2.4.1 ChronoUnit-多种时间单位的比较

package com.itheima.jdk8.p8_interval;

import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;

/**
 * ChronoUnit可用于在单个时间单位内测量一段时间,这个工具类是最全的了,可以用于比较所有的时间单位
 */
public class ChronoUnitDemo {
    public static void main(String[] args) {
        // 本地日期时间对象:此刻的
        LocalDateTime today = LocalDateTime.now();
        System.out.println(today);

        // 生日时间
        LocalDateTime birthDate = LocalDateTime.of(2023, 2, 4,
                0, 0, 0);
        System.out.println(birthDate);

        System.out.println("相差的年数:" + ChronoUnit.YEARS.between(birthDate, today));
        System.out.println("相差的月数:" + ChronoUnit.MONTHS.between(birthDate, today));
        System.out.println("相差的周数:" + ChronoUnit.WEEKS.between(birthDate, today));
        System.out.println("相差的天数:" + ChronoUnit.DAYS.between(birthDate, today));
        System.out.println("相差的时数:" + ChronoUnit.HOURS.between(birthDate, today));
        System.out.println("相差的分数:" + ChronoUnit.MINUTES.between(birthDate, today));
        System.out.println("相差的秒数:" + ChronoUnit.SECONDS.between(birthDate, today));
        System.out.println("相差的毫秒数:" + ChronoUnit.MILLIS.between(birthDate, today));
        System.out.println("相差的微秒数:" + ChronoUnit.MICROS.between(birthDate, today));
        System.out.println("相差的纳秒数:" + ChronoUnit.NANOS.between(birthDate, today));
        System.out.println("相差的半天数:" + ChronoUnit.HALF_DAYS.between(birthDate, today));
        System.out.println("相差的十年数:" + ChronoUnit.DECADES.between(birthDate, today));
        System.out.println("相差的世纪(百年)数:" + ChronoUnit.CENTURIES.between(birthDate, today));
        System.out.println("相差的千年数:" + ChronoUnit.MILLENNIA.between(birthDate, today));
        System.out.println("相差的纪元数:" + ChronoUnit.ERAS.between(birthDate, today));
    }
}

2.4.2 Duration计算日期间隔 (时分秒)

package com.itheima.jdk8.p8_interval;

import java.time.Duration;
import java.time.LocalDateTime;

/**
 * Duration计算日期间隔 (时分秒)
 */
public class DurationDemo {
    public static void main(String[] args) {
        // 此刻日期时间对象
        LocalDateTime today = LocalDateTime.now();
        System.out.println(today);

        // 昨天的日期时间对象
        LocalDateTime otherDate = LocalDateTime.of(2023, 2
                , 4, 0, 0, 0);

        System.out.println(otherDate);

        Duration duration = Duration.between(otherDate, today); // 第二个参数减第一个参数

        System.out.println(duration.toDays());                  // 两个时间差的天数
        System.out.println(duration.toHours());                 // 两个时间差的小时数
        System.out.println(duration.toMinutes());               // 两个时间差的分钟数
        System.out.println(duration.toMillis());                // 两个时间差的毫秒数
        System.out.println(duration.toNanos());                 // 两个时间差的纳秒数
    }
}

2.4.3 Period计算日期间隔 (年月日)

package com.itheima.jdk8.p8_interval;

import java.time.LocalDate;
import java.time.Period;

/**
 * Period计算日期间隔 (年月日)
 */
public class PeriodDemo {
    public static void main(String[] args) {
        // 此刻年月日
        LocalDate today = LocalDate.now();
        System.out.println(today);

        // 昨天年月日
        LocalDate otherDate = LocalDate.of(2023, 2, 4);
        System.out.println(otherDate);

        //Period对象表示时间的间隔对象
        Period period = Period.between(today, otherDate);    // 第二个参数减第一个参数

        System.out.println(period.getYears());      // 间隔多少年
        System.out.println(period.getMonths());     // 间隔的月份
        System.out.println(period.getDays());       // 间隔的天数
        System.out.println(period.toTotalMonths()); // 总月份
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码里码理~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值