Bootstrap

JAVA中的Date类总结

常用API

(一)JDK8之前

Date类

Date类表示系统的时间

在这里插入图片描述

 // 默认的无参构造函数设定为当前时间
        Date day = new Date();
        System.out.println(day);

        // 得到时间毫秒值
        // 从1970年
        long time =day.getTime();
        System.out.println(time);

        // 有参的构造函数将自1970年的毫秒值转为日期
        Date day2 =new Date(time);
       
        // 使用毫秒值设置新的Date数据
        day2.setTime(time);

SimpleDateFormat类

类似于一个转化器 将Date类对象或者毫秒值转化为特定格式
在这里插入图片描述

  SimpleDateFormat po = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss EEE a");
        String x = po.format(time);
        String y = po.format(day);
        System.out.println(x+""+y);

将字符串类型的日期转为日期对象

在这里插入图片描述

  String datestr = "2024-11-12 12:11:01";
        SimpleDateFormat forma = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date X = forma.parse(datestr);
        System.out.println(po.format(X));

一个相关样例

   String start = "2024年11月11日 0:0:0";
        String end = "2024年11月11日 0:10:0";
        String time1 = "2024年11月11日 0:2:45";
        String time2 = "2024年11月11日 0:11:45";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        Date start_ = sdf.parse(start);
        Date end_ = sdf.parse(end);
        Date time1_ = sdf.parse(time1);
        Date time2_ = sdf.parse(time2);

        long st = start_.getTime();
        long en = end_.getTime();
        long ti1 = time1_.getTime();
        long ti2 = time2_.getTime();

        if (ti1 > st && ti1 < en) {
            System.out.println("前者成功");
        } else {
            System.out.println("gg");
        }
        if (ti2 > st && ti2 < en) {
            System.out.println("后者成功");
        }
        System.out.println("gg");

Calender类

代表系统时间对应的日历信息
可以单独修改或者获取此刻对应的日历

在这里插入图片描述

  //  获得当前的日历对象
        Calendar rightrow = Calendar.getInstance();

        // 获得特定信息
        System.out.println("这是一年中的第:"+rightrow.get(Calendar.DAY_OF_YEAR)+"天");

        // 向Date类型变量转化
        Date x = rightrow.getTime();
        System.out.println(x);

        // 向long类型变量转化
        long y =rightrow.getTimeInMillis();
        System.out.println(y);

        // 设置Calender对象特定项的值
        rightrow.set(Calendar.DAY_OF_MONTH,9);

        System.out.println(rightrow.get(Calendar.DAY_OF_MONTH));

        // 添加或者减少特定项的值
        rightrow.add(Calendar.DAY_OF_MONTH,-1);
        System.out.println(rightrow.get(Calendar.DAY_OF_MONTH));

(二)JDK8之后

为什么要学习JDK8之后新增的时间类

在这里插入图片描述

解释

1.Date类中的getYear()方法默认得到当前公历年份 - 1900的值
2.没有修改记录
3.多人使用时不安全
4.精确度不够
1秒 = 1000毫秒
1毫秒 = 1000微秒
1微秒 = 1000纳秒

新旧分类

替代Calender:

LocalDate:年 月 日
LocalTime:时 分 秒
LocalDateTime:年 月 日 时 分 秒
Zone: 时区
ZoneDateTime:带时区的时间

替代Date:
Instant:时间戳

替代SimpleDateFormat:
DateTimeFormatter:时间 格式化&&解析

其他:
Period:时间间隔(年 月 日)
Duration:时间间隔(时 分 秒)

第一部分:LocalDate LocalTime LocalDateTime

三个类都是单例类

在这里插入图片描述

public static void main(String[] args) {
        //  年月日
        LocalDate ld = LocalDate.now();
        //  时分秒
        LocalTime lt = LocalTime.now();
        //  年月日时分秒
        LocalDateTime ldt = LocalDateTime.now();

        // LocalDate
        int year = ld.getYear();
        int month = ld.getMonthValue();
        int day =ld.getDayOfMonth();
        int dayofyear = ld.getDayOfYear();
        // 返回星期几
        int dayofweek = ld.getDayOfWeek().getValue();

        System.out.println("这是" + year+"年 第"+month+"月 第"+day+"日 ,并且是一年中的第"+dayofyear+"天 星期:"+dayofweek);

        
    }

LocalDate类

1.获取特定年月日信息

        // LocalDate
        int year = ld.getYear();
        int month = ld.getMonthValue();
        int day =ld.getDayOfMonth();
        int dayofyear = ld.getDayOfYear();
        // 返回星期几
        int dayofweek = ld.getDayOfWeek().getValue();

        System.out.println("这是" + year+"年 第"+month+"月 第"+day+"日 ,并且是一年中的第"+dayofyear+"天 星期:"+dayofweek);

2.修改特定年月日信息

注:这三个类对象都是不可变对象所以修改后只返回一个新的该对象的值

        LocalDate ld2 =ld.withYear(2025);
//      ld.withMonth(1);
//      ld.withDayOfMonth(1);
//      ld.withDayOfYear(2);

3.增加或者减少特定年月日数据值

        LocalDate ld3 = ld.plusYears(1);
//        LocalDate ld3 = ld.plusMonths(1);
//        LocalDate ld3 = ld.plusDays(1);
//        LocalDate ld3 = ld.plusWeeks(1);
        LocalDate ld4 = ld.minusYears(1);
//        LocalDate ld4 = ld.minusMonths(1);
//        LocalDate ld4 = ld.minusDays(1);
//        LocalDate ld4 = ld.minusWeeks(1);

4.获取特定年月日数据的LocalDate类对象

        LocalDate ld5 = LocalDate.of(2025,5,25);
        System.out.println("这是" + ld5.getYear()+"年 第"+month+"月 第"+day+"日 ,并且是一年中的第"+dayofyear+"天 星期:"+dayofweek);

5.比较特定年月日数据的LocalDate类对象之间关系


        LocalDate ld = LocalDate.now();
        LocalDate ld2 = LocalDate.of(2025,12,1);
        System.out.println("ld和ld2表示的年月日是否相等:"+ld.equals(ld2));
        System.out.println("ld表示的年月日是否在ld2之后:"+ld.isBefore(ld2));
        System.out.println("ld表示的年月日是否在ld2之前:"+ld.isAfter(ld2));

LocalTime类

1.获取特定时分秒信息

        //  时分秒
        LocalTime lt = LocalTime.now();

        int hour = lt.getHour();
        int minute = lt.getMinute();
        int second = lt.getSecond();
        System.out.println("这是" + hour+"时 第"+minute+"分 第"+second+"秒");

2.修改特定时分秒信息

LocalTime lt2 = lt.withHour(12);

3.增加或者减少特定时分秒数据值

 LocalTime lt3 = lt.plusHours(1);

 LocalTime lt4 = lt.minusHours(1);

4.获取特定年月日数据的LocalTime类对象

 LocalTime lt5 = LocalTime.of(1,1,1);

5.比较特定年月日数据的LocalTime类对象之间关系

   LocalTime lt = LocalTime.now();
        LocalTime lt2 =LocalTime.of(17,12,35);
        System.out.println("lt和lt2表示的时分秒是否相等:"+lt.equals(lt2));
        System.out.println("lt表示的时分秒是否在lt2之后:"+lt.isBefore(lt2));
        System.out.println("lt表示的时分秒是否在lt2之前:"+lt.isAfter(lt2));

LocalDateTime类

额外功能:可将LocalDateTime类对象向其他两个类对象转化

LocalDate ld = LocalDate.now();
        LocalTime lt = LocalTime.now();
        LocalDateTime ldt = LocalDateTime.now();

        LocalDate LD = ldt.toLocalDate();
        LocalTime LT = ldt.toLocalTime();
        LocalDateTime LDT = LocalDateTime.of(ld,lt);

第二部分:ZoneID ZonedDateTime

ZoneID 代表时区

   // 获取系统默认的时区
        ZoneId zi = ZoneId.systemDefault();
        System.out.println(zi.getId());

        // 获取一切可用的时区集合
        System.out.println(ZoneId.getAvailableZoneIds());

        // 将ZoneId封装成为ZoneId对象
        ZoneId zi2 = ZoneId.of(zi.getId());

        // 根据ZoneId对象获取对应时区的ZonedDateTime对象
        ZonedDateTime zdt = ZonedDateTime.now(zi2);

        //获取世界标准时间的ZonedDateTime对象
        ZonedDateTime  standard = ZonedDateTime.now(Clock.systemUTC());

        //获取系统默认时区的ZonedDateTime对象
        ZonedDateTime defauT = ZonedDateTime.now();

第三部分:Instant类

表示时间线上的某一刻,可精确到纳秒,通常做代码的耗时分析

Instant now = Instant.now();
        // 获取Instant对象距1970-1-1 00:00 的总秒数
        long time = now.getEpochSecond();
        System.out.println(time);

        // 获取不足一秒的纳秒数
        long nottidetime = now.getNano();

        // plus系列方法改变某一个项目的值 该类也是不可变对象
        Instant newtime = now.plusSeconds(1);
        System.out.println(now + " " + newtime);

第四部分:代替JDK8之前的SimpleDateFormat类: DateTimeFormatter

SimpleDateFormat类缺点:线程不安全且是可变类型对象

在这里插入图片描述

// 创建DateTimeFormatter类对象
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年 MM月 dd日 HH:mm:ss");

        // 格式化LocalDateTime方法为字符串
        LocalDateTime ldt = LocalDateTime.now();
        String desc = dtf.format(ldt);
        System.out.println(desc);

        // 或者
        System.out.println(ldt.format(dtf));

        // 解析时间
        String waittime = "2024年06月02日 01:01:01";
        DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
        LocalDateTime parsetime = LocalDateTime.parse(waittime,dtf2);
        System.out.println(parsetime);

第五部分:Period类 Duration类

Period类计算两个LocalDate之间相差的年月日数

在这里插入图片描述

        LocalDateTime time1 = LocalDateTime.of(2023,12,31,12,12,12);
        LocalDateTime time2 = LocalDateTime.of(2026,1,1,1,1,1);
        LocalDate time1_ = time1.toLocalDate();
        LocalDate time2_ = time2.toLocalDate();

        Period dur = Period.between(time1_,time2_);
        System.out.println(dur.getMonths()+" "+dur.getYears()+" "+dur.getDays());

Duration类计算两个LocalTime之间相差的时分秒数

同时也支持LocalDateTime或Instant类型时间的计算

在这里插入图片描述

LocalTime _time1 = time1.toLocalTime();
        LocalDateTime time1 = LocalDateTime.of(2023,12,31,12,12,12);
        LocalDateTime time2 = LocalDateTime.of(2026,1,1,1,1,1);
        
        LocalTime _time1 = time1.toLocalTime();
        LocalTime _time2 = time2.toLocalTime();

        Period dur = Period.between(time1_,time2_);
        System.out.println(dur.getMonths()+" "+dur.getYears()+" "+dur.getDays());

        Duration per = Duration.between(_time2,_time1);
        System.out.println(per.toDays()+ " " + per.toHours());

此篇结束

;