一. 为什么要学习新增的日期/时间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
(一)说明
时区/带时区的时间
(图片来自黑马程序员)
(二)常用方法
(图片来自黑马程序员)
(三)使用
- 获取系统默认时区
java
ZoneId zoneId = ZoneId.systemDefault();
System.out.println(zoneId.getId());
返回值为String类型
- 获取Java支持的全部时区ID
java
System.out.println(ZoneId.getAvailableZoneIds())
- 把某个时区ID封装成一个ZoneID对象
java
ZoneId zoneId1 = ZoneId.of("America/Los_Angeles");
- 通过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);
}
}
- 解析时间
解析时间一般使用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() | 计算隔多少纳秒,并返回 |