JAVA基础|常用API-JDK8之后新增的日期,时间

一. 为什么要学习新增的日期/时间API?

(图片来自黑马程序员)

二. LocalDate,LocalTime,LocalDateTime

代替Calendar

(一)获取对象的方案

方法名 示例
public static xxxx now(); 获取系统当前时间对应的该对象 LocalDate ld = LocalDate.now(); LocalTime lt = LocalTime.now(); LocalDateTime ldt = LocalDateTime.now();
public static xxxx of(......); 获取指定时间的对象 LocalDate localDate1 = LocalDate.of(2099,11,11); LocalTime localTime1 = LocalTime.of(9,8,59); LocalDateTime localDateTime1 = LocalDateTime.of(2025,11,16,14,30,01);

(二)常用方法

(图片来自黑马程序员)

(三)使用

1. 获取本地日期对象

LocalDate:

java 复制代码
LocalDate ld = LocalDate.now();
System.out.println(ld);

LocalTime:

java 复制代码
LocalTime lt = LocalTime.now();
System.out.println(lt);

2. 获取日期对象中的信息

LocalDate:

java 复制代码
int year = ld.getYear();    //年
int month = ld.getMonthValue(); //月(1-12)
int day = ld.getDayOfMonth();   //日
int dayOfYear = ld.getDayOfYear();  //一年中的第几天
int dayOfWeek = ld.getDayOfWeek().getValue();   //星期几

LocalTime:

java 复制代码
int hour = lt.getHour();
int minute = lt.getMinute();
int second = lt.getSecond();
int nano = lt.getNano();

3. 直接修改某个信息

这里和传统日期api就不一样咯,修改后会返回修改值,但是原始值是没有改变的。

LocalDate:

java 复制代码
public class Test1_LocalDate {
    public static void main(String[] args) {
        LocalDate ld = LocalDate.now();
        System.out.println(ld);

        LocalDate ld2 = ld.withYear(2099);
        System.out.println();
        System.out.println(ld);
        System.out.println(ld2);
    }
}

LocalTime:

java 复制代码
LocalTime lt2 = lt.withHour(10);
LocalTime lt2 = lt.withMinute(10);
LocalTime lt2 = lt.withSecond(10);
LocalTime lt2 = lt.withNano(10);

4. 把某个信息增减/减少多少

LocalDate:

java 复制代码
LocalDate ld3 = ld.plusDays(1);    //增加
LocalDate ld4 = ld.minusDays(2);    //减少

LocalTime:

java 复制代码
LocalTime lt3 = lt.plusHours(1);    //增加
LocalTime lt4 = lt.minusHours(2);    //减少

5.获取指定日期的对象

LocalDate:

java 复制代码
LocalDate ld5 = LocalDate.of(2022,12,12);

LocalTime:

java 复制代码
LocalTime lt1 = LocalTime.of(12,12,12);    //小时,分钟,秒

6. 判断两个日期对象,是否相等,在前还是在后

equals判断是否相等

isBefore判断ld1是否在ld2前面

isAfter判断ld1是否在ld2后面

返回true,false

java 复制代码
System.out.println(ld1.equals(ld2));
System.out.println(ld1.isBefore(ld2));
System.out.println(ld1.isAfter(ld2));

7.把LocalDateTime转换成LocalDate和LocalTime

java 复制代码
LocalDate ld = ldt.toLocalDate();
LOcalTime lt = ldt.toLocalTIme();

8.把LocalDate和LocalTime转换成LocalDateTime

java 复制代码
LocalDateTime ldt = LocalDateTime.of(ld,lt);

三. ZoneId,ZonedDateTime

代替Calendar

(一)说明

时区/带时区的时间

(图片来自黑马程序员)

(二)常用方法

(图片来自黑马程序员)

(三)使用

  1. 获取系统默认时区
java 复制代码
ZoneId zoneId = ZoneId.systemDefault();
System.out.println(zoneId.getId());

返回值为String类型

  1. 获取Java支持的全部时区ID
java 复制代码
System.out.println(ZoneId.getAvailableZoneIds())
  1. 把某个时区ID封装成一个ZoneID对象
java 复制代码
ZoneId zoneId1 = ZoneId.of("America/Los_Angeles");
  1. 通过ZoneId,使用ZonedDateTime来获取某个时区的ZonedDateTime对象
java 复制代码
ZonedDateTime now = ZonedDateTime.now(zoneId);
System.out.println(now);

获取世界标准时间(UTC):

java 复制代码
ZonedDateTime now1 = ZonedDateTime.now(Clock.systemUTC());
System.out.println(now1);

那如果不给now任何参数,她就会打印出系统当前时间,时区


四. Instant

一. 说明

Instant可以拿到从1970年1月1日到如今的总秒数,而LocalDateTime只能拿到不够1s的纳秒数

(二)使用

1. 创建Instant对象,获取此刻时间信息

java 复制代码
Instant now = Instant.now();

2. 获取总秒数

java 复制代码
long second = now.getEpochSecond();

3. 获取不够1秒的纳秒数

java 复制代码
int nano = now.getNano();

4. 增加,减少纳秒

java 复制代码
Instant instant = now.plusNanos(111);

五. DateTimeFormatter

(一)说明

SimpleDateFormat-线程不安全,而DateTimeFormatter线程安全

(二)常用方法

DateTimeFormatter:

方法名 说明
public static DateTimeFormatter of Pattern(时间格式) 获取格式化器对象
public String format(时间对象) 格式化时间

LocalDateTime提供的格式化,解析时间的方法:

方法名 说明
public String format(DateTimeFormatter formatter) 格式化时间
public static LocalDateTime parse(CharSequence text,DateTimeFormatter formatter) 解析时间

(三)使用

1. 格式化某个时间

方案一:

formatter.format(now) 正向格式化:拿格式化器去格式化时间

java 复制代码
public class Test3_DateTimeFormatter {
    public static void main(String[] args) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");

        LocalDateTime now = LocalDateTime.now();
        System.out.println(now);

        String rs = formatter.format(now);
        System.out.println(rs);
    }
}

方案二:

now.format(formatter) 反向格式化:拿时间给格式化器格式化自己

java 复制代码
public class Test3_DateTimeFormatter {
    public static void main(String[] args) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");

        LocalDateTime now = LocalDateTime.now();
        System.out.println(now);

        String rs = now.format(formatter);
        System.out.println(rs);
    }
}
  1. 解析时间

解析时间一般使用LoacalDateTime提供的解析方法来解析

java 复制代码
String dateStr = "2029年12月12日 12:12:11";
LocalDateTime ldt = LocalDateTime.parse(dateStr, formatter);
System.out.println(ldt);

六. Period,Duration

(一)说明

Period:可以用于计算两个LocalDate对象 相差的年数,月数,天数

Duration:可以用于计算两个时间对象相差的天数,小时数,分数,秒数,纳秒数;支持LocalTime,LocalDateTime,Instant等时间

(二)常用方法

Period:

方法名 说明
public static Period between(LocalDate start,LocalDate end) 传入2个日期对象,得到Period对象
public int getYears() 计算隔几年,并返回
public int getMonths() 计算隔几个月,并返回
public int getDays() 计算隔多少天,并返回

Duration:

方法名 说明
public static Duration between(开始时间对象1,截止时间对象2) 传入2个时间对象,得到Duration对象
public long toDays() 计算隔多少天,并返回
public long toHours() 计算隔多少小时,并返回
public long toMinutes() 计算隔多少分,并返回
public long toSeconds() 计算隔多少秒,并返回
public long toMillis() 计算隔多少毫秒,并返回
public long toNanos() 计算隔多少纳秒,并返回
相关推荐
XiaoLeisj2 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
paopaokaka_luck2 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
dayouziei2 小时前
java的类加载机制的学习
java·学习
励志成为嵌入式工程师3 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
捕鲸叉3 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer3 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq3 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
Yaml44 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~4 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616884 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端