Java8的新日期API

!!! note 目录

Java8的新日期API

一、LocalDate日期、LocalTime时间、LocalDateTime日期时间

方法都一样,以LocalDateTime举例讲解

1.1 获取当前时间(精确到纳秒)

  • 1秒=1000毫秒
  • 1毫秒=1000微秒
  • 1微秒=1000纳秒
1
2
3
4
5
6
@Test
public void testLocalDateTimeNow(){
//获取系统当前时间,精确到纳秒级。
LocalDateTime now = LocalDateTime.now();
System.out.println(now);
}

1.2获取指定日期时间

1
2
3
4
5
6
@Test
public void testLocalDateTimeOf(){
//获取指定日期的时间
LocalDateTime localDateTime = LocalDateTime.of(2020, 7, 7, 9, 1, 1, 1);
System.out.println(localDateTime);
}

1.3 加日期时间

1
2
3
4
5
6
@Test
public void testLocalDateTimePlus(){
LocalDateTime now = LocalDateTime.now();
LocalDateTime localDateTime = now.plusYears(2).plusMonths(6).plusDays(1).plusHours(0).plusMonths(0).plusSeconds(0).plusNanos(0);
System.out.println(localDateTime);
}

这里涉及了链式调用:now.plusYears(2).plusMonths(6).plusDays(1).plusHours(0).plusMonths(0).plusSeconds(0).plusNanos(0);
因为这几个方法返回LocalDateTime,所以可以这么调用。
在编写程序时可以参考此原理。

1.4 减日期时间

1
2
3
4
5
6
@Test
public void testLocalDateTimeMinus(){
LocalDateTime now = LocalDateTime.now();
LocalDateTime localDateTime = now.minusYears(2).minusMonths(6).minusDays(1).minusHours(0).minusMonths(0).minusSeconds(0).minusNanos(0);
System.out.println(localDateTime);
}

二、Instant时间戳(获取1970年1月1日 0时0分0秒到某个时间的时间戳)

1
2
3
4
5
6
7
8
9
10
11
12
@Test
public void testInstant(){
long l = System.currentTimeMillis();
System.out.println("时间戳:"+l);

//Java 8的API也可以获取时间戳
Instant now = Instant.now(); //系统当前时间,基于UTC(全球标准时间)
System.out.println(now);

long epochMilli = now.toEpochMilli();
System.out.println("时间戳:"+epochMilli);
}

三、Duration计算时间间隔

1
2
3
4
5
6
7
8
9
10
11
@Test
public void testDuration(){
// 获取时间1
LocalDateTime time1 = LocalDateTime.of(2020, 1, 1, 0, 0, 0, 0);
// 获取时间2
LocalDateTime time2 = LocalDateTime.of(2024, 1, 1, 0, 0, 0, 0);
// 获取两个时间的差
Duration between = Duration.between(time1, time2);
System.out.println("相差多少天:"+between.toDays());
System.out.println("相差多少小时:"+between.toHours());
}

四、Period计算日期间隔

1
2
3
4
5
6
7
8
9
10
@Test
public void testPeriod(){
//获取日期1
LocalDate date1 = LocalDate.of(2020, 7, 7);
//获取日期2
LocalDate date2 = LocalDate.of(2024, 9, 12);
//计算两个日期差
Period between = Period.between(date1, date2);
System.out.println("差多少年:"+between.getYears()+"\t差多少月:"+between.getMonths()+"\t差多少天"+between.getDays());
}

五、TemporalAdjusters 时间矫正器

5.1 常用的 TemporalAdjusters 方法

  1. **firstDayOfMonth()**:返回该月份的第一个日。
  2. **firstDayOfNextMonth()**:返回下个月的第一个日。
  3. **firstDayOfNextYear()**:返回下一年的第一个日。
  4. **firstDayOfYear()**:返回当前年份的第一个日。
  5. **lastDayOfMonth()**:返回该月份的最后一个日。
  6. **lastDayOfYear()**:返回当前年份的最后一个日。
  7. **next(DayOfWeek dow)**:返回下一个指定的星期。
  8. **previous(DayOfWeek dow)**:返回上一个指定的星期。
  9. **nextOrSame(DayOfWeek dow)**:返回下一个指定的星期,如果今天已经是这个星期,则返回今天。
  10. **previousOrSame(DayOfWeek dow)**:返回上一个指定的星期,如果今天已经是这个星期,则返回今天。

5.2 示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import java.time.LocalDate;
import java.time.DayOfWeek;
import java.time.temporal.TemporalAdjusters;

public class TemporalAdjustersExample {
public static void main(String[] args) {
LocalDate today = LocalDate.now();

// 本月的第一天
LocalDate firstDayOfMonth = today.with(TemporalAdjusters.firstDayOfMonth());
System.out.println("First day of this month: " + firstDayOfMonth);

// 下个月的第一天
LocalDate firstDayOfNextMonth = today.with(TemporalAdjusters.firstDayOfNextMonth());
System.out.println("First day of next month: " + firstDayOfNextMonth);

// 本月的最后一天
LocalDate lastDayOfMonth = today.with(TemporalAdjusters.lastDayOfMonth());
System.out.println("Last day of this month: " + lastDayOfMonth);

// 下一个星期一
LocalDate nextMonday = today.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
System.out.println("Next Monday: " + nextMonday);

// 上一个星期五
LocalDate previousFriday = today.with(TemporalAdjusters.previous(DayOfWeek.FRIDAY));
System.out.println("Previous Friday: " + previousFriday);

// 本周的星期五,如果今天已经是星期五,则返回今天
LocalDate fridayOrToday = today.with(TemporalAdjusters.nextOrSame(DayOfWeek.FRIDAY));
System.out.println("Friday or today: " + fridayOrToday);
}
}

六、DateTimeFormatter 日期格式化

6.1 LocalDateTime –> String

1
2
3
4
5
6
7
8
9
@Test
public void testDateTimeFormatter(){
LocalDateTime now = LocalDateTime.now();
//创建格式化对象
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//格式化
String formatted = dateTimeFormatter.format(now);
System.out.println(formatted);
}

6.2 String –> LocalDateTime

1
2
3
4
5
6
7
8
@Test
public void testDateTimeFormatter(){
//创建格式化对象
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime parse = LocalDateTime.parse("2020-07-07 09:00:00", dateTimeFormatter);
System.out.println(parse);
}