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() 计算隔多少纳秒,并返回
相关推荐
夏幻灵6 小时前
JavaScript this 面试:五种绑定规则、优先级与常见面试陷阱
开发语言·javascript·面试
程序猿编码7 小时前
榨干 RTX5090 算力!Qwen3 专用单卡推理引擎,手写C++/CUDA 算子实现 MTP 推测解码
开发语言·c++·大模型推理·qwen3·多模态推理
bkspiderx8 小时前
Qt 插件机制:动态扩展应用功能的核心框架
开发语言·qt·元数据·qt 插件·qpluginloader
代码什么用8 小时前
Spring基础使用
java·后端·spring
程序员老陆8 小时前
深入理解 C++ thread_local:线程私有存储的正确打开方式
开发语言·c++·程序设计
沐晓时光8 小时前
C语言入门,深入理解指针(3)
c语言·开发语言
Su米苏9 小时前
Spring AI 中MCP 与普通 @Tool的区别
java·人工智能·spring
码云数智-园园9 小时前
unique_ptr 还是 shared_ptr?C++ 智能指针选型与内存泄漏实战分析
java·开发语言
老板一杯拿铁9 小时前
Java 异常体系详解:从字节码原理到最佳实践
java
蜗牛互联网9 小时前
Java 17 HttpClient调用文件转写API的超时与失败回退
java·人工智能·后端