Java8时间及日期

旧的日期类是可变且线程不安全的,Java8中引入了一套全新的日期APIjava.time包中的类是不可变且线程安全。

LocalDate

java.time.LocalDate是用来表示日期的,不包含具体的时间,默认按照yyyy-MM-dd格式。

  • 获取当前日期:LocalDate.now()
  • 根据年月日构建日期:LocalDate.of(2018, 01, 30)
  • 字符串转换日期:LocalDate.parse("2018-01-30"),也可以自定义格式,如:LocalDate.parse("2018年01月30日", DateTimeFormatter.ofPattern("uuuu年MM月dd日"))
  • 本月第一天:localDate.with(TemporalAdjusters.firstDayOfMonth())
  • 本月第二天:localDate.withDayOfMonth(2)
  • 本月最后一天:localDate.with(TemporalAdjusters.lastDayOfMonth())
  • 明天:localDate.plusDays(1L)
  • 昨天:localDate.minusDays(1L)
  • 获取本年第120天:localDate.withDayOfYear(120)
  • 计算两个日期间的天数:localDate.until(localDate1, ChronoUnit.DAYS)
  • 计算两个日期间的周数:localDate.until(localDate1, ChronoUnit.WEEKS)

LocalTime

LocalTimeLocalDate相反,其仅表示时间,不包含日期。

  • 获取当前时间(包含毫秒数):LocalTime.now()
  • 构建指定时间:LocalTime.of(12, 15, 30)
  • 获取指定时间(不包含毫秒数):localTime.withNano(0)
  • 字符串转为时间
    • LocalTime.parse("12:15:30")
    • LocalTime.parse("12:15:30.233")
    • LocalTime.parse("12:15")
    • LocalTime.parse("12时15分30秒", DateTimeFormatter.ofPattern("HH时mm分ss秒"))

LocalDateTime

LocalDateTime和旧的java.util.Date类是,既包含日期,又包含时间,且经常与DateTimeFormatter一起使用。

  • 获取当前年月日时分秒:LocalDateTime.now()
  • 通过LocalDateLocalTime构建:LocalDateTime.of(LocalDate.now(), LocalTime.now())

时间差

计算相差的天数:

1
2
3
4
5
6
7
8
9
10
11
12
public static long getDaysBetween(LocalDate firstDate, LocalDate secondDate) {
if (firstDate == secondDate) {
return 0;
}
if (firstDate == null) {
firstDate = LocalDate.now();
}
if (secondDate == null) {
secondDate = LocalDate.now();
}
return Math.abs(firstDate.toEpochDay() - secondDate.toEpochDay());
}

计算相差的小时数:

1
2
3
4
5
6
7
8
9
10
11
12
13
public static long getHoursBetween(LocalDateTime firstDate, LocalDateTime secondDate) {
if (firstDate == secondDate) {
return 0;
}
if (firstDate == null) {
firstDate = LocalDateTime.now();
}
if (secondDate == null) {
secondDate = LocalDateTime.now();
}
Long diffHours = Math.abs(Duration.between(firstDate, secondDate).toHours());
return diffHours;
}

Date与JAVA8时间类互转

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//Date与Instant的相互转化
Instant instant = Instant.now();
Date date = Date.from(instant);
Instant instant2 = date.toInstant();

//Date转为LocalDateTime
Date date2 = new Date();
LocalDateTime localDateTime2 = LocalDateTime.ofInstant(date2.toInstant(), ZoneId.systemDefault());

//LocalDateTime转Date
LocalDateTime localDateTime3 = LocalDateTime.now();
Instant instant3 = localDateTime3.atZone(ZoneId.systemDefault()).toInstant();
Date date3 = Date.from(instant);

//LocalDate转Date
//因为LocalDate不包含时间,所以转Date时,会默认转为当天的起始时间,00:00:00
LocalDate localDate4 = LocalDate.now();
Instant instant4 = localDate4.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant();
Date date4 = Date.from(instant);