基於JDK8
下面是基於JDK8來進行編碼和講解的。
重新定義
java8對時間和日期相關的操作進行了重新分類和整理,使得使用起來更加方便和實用。
- 對時間和日期的相關操作進行了細分:時間、日期、時間&日期,時間戳、時間段、格式化
- 所有類都是不可變的、線程安全的
- 兼容舊的日期和時間
API
對於一般來說,常用的API就是下面所列出的六種,在實際使用的過程中,需要哪個就使用哪個來進行操作。
- LocalDateTime:日期時間
- LocalDate:僅表示日期
- LocalTime:僅表示時間
- Peroid:僅表示日期間隔
- Duration:時間間隔,以秒和納秒爲單位
- DateTimeFormatter:可以格式化LocalDate,LocalTime以及LocalDateTime
常見用法
下面分別展示幾個常見的用法,基本涵蓋了常見的使用場景。
- 獲取當前時間
LocalDateTime localDateTime = LocalDateTime.now();
// 打印結果: 2019-12-05T16:58:11.936
- 獲取指定時間
LocalDateTime localDateTime2 = LocalDateTime.of(2019, 12, 2, 23, 59, 59);
// 打印結果: 2019-12-02T23:59:59
- 日期/時間加減操作
// localDateTime2的基礎上加1天零1s
LocalDateTime localDateTime3 = localDateTime2.plusDays(1).plusSeconds(1);
// 打印結果:2019-12-04T00:00
- 獲取指定的字段(年月日時分秒,納秒,不支持毫秒)
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("現在是: " + localDateTime.getYear() + " 年中的第 " + localDateTime.getDayOfYear() +" 天");
// 現在是: 2019 年中的第 339 天
- 獲取UTC時間(格林尼治時間)
Instant instant = Instant.now();
// 打印結果:2019-12-05T09:09:21.360Z
- 獲取北京時間(東8區)
// OffsetTime表示有時差的時間,除了UTC時間,都是OffsetTime
Instant instant = Instant.now();
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
// 打印結果: 2019-12-05T17:10:38.330+08:00
- 獲取毫秒數(1970-01-01T00:00:00Z開始計算)
Instant instant = Instant.now();
long epochMilli = instant.toEpochMilli();
// 打印結果:1575537087543
- 定義時間戳
Instant instant1 = Instant.ofEpochSecond(59);
// 打印結果: 1970-01-01T00:00:59Z
instant2 = instant1.plusSeconds(99)
// 打印結果:1970-01-01T00:02:38Z
- 計算日期間隔(參數位置影響結果哦)
Instant instant1 = Instant.now();
Instant instant2 = instant1.plusSeconds(99);
Duration duration1 = Duration.between(instant1, instant2);
Duration duration2 = Duration.between(instant2, instant1);
// 打印結果 duration1:PT1M39S
// 打印結果 duration2:PT-1M-39S
long duration1Seconds = duration1.getSeconds();
long duration2Seconds = duration1.getSeconds();
// 打印結果 duration1Seconds: 90
// 打印結果 duration2Seconds: -90
- 操作時間間隔
Duration duration3 = duration1.plusDays(1);
// 打印結果:PT24H1M39S
注意 : 僅支持時間操作(Instant, LocalTime,LocalDateTime),不支持日期(LocalDate)
- 日期間隔
LocalDate localDate1 = LocalDate.now();
LocalDate localDate2 = localDate1.plusDays(1);
Period period = Period.between(localDate1, localDate2);
long days = period.getDays();
//輸出結果P1D
//輸出結果1
- 獲取指定日期或時間
LocalDateTime localDateTime1 = LocalDateTime.now();
LocalDateTime localDateTime2 = localDateTime1.withDayOfMonth(20);
// 打印結果 localDateTime1:2019-12-09T11:08:25.055
// 打印結果 localDateTime2:2019-12-20T11:08:25.055
- 獲取下一個固定日期(下一個星期天)
LocalDateTime localDateTime1 = LocalDateTime.now();
LocalDateTime localDateTime3 = localDateTime1.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
// 打印結果 localDateTime3:2019-12-15T11:09:46.092
- 定義矯正器
獲取下一個工作日
LocalDateTime localDateTime4 = localDateTime.with((tempDateTime) -> {
LocalDateTime localDateTime5 = (LocalDateTime) tempDateTime;
DayOfWeek dayOfWeek = localDateTime5.getDayOfWeek();
if (dayOfWeek.equals(DayOfWeek.FRIDAY)) {
return localDateTime5.plusDays(3);
} else if (dayOfWeek.equals(DayOfWeek.SATURDAY)) {
return localDateTime5.plusDays(2);
} else {
return localDateTime5.plusDays(1);
}
});
// 打印結果 localDateTime4:2019-12-10T11:11:57.218
- 日期時間格式化
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime localDateTime = LocalDateTime.now();
String dateStr =dateTimeFormatter.format(localDateTime);
System.out.println(dateStr);
// 打印結果: 2019-12-09 11:13:40
LocalDateTime localDateTime2 = LocalDateTime.parse(dateStr, dateTimeFormatter);
System.out.println(localDateTime2);
// 打印結果: 2019-12-09T11:13:40
LocalDate localDate = LocalDate.parse(dateStr, dateTimeFormatter);
System.out.println(localDate);
// 打印結果: 2019-12-09
基於Instant進行轉換
Java8對於時間戳、日期時間以及老版本的Date對象之間的轉化也進行了兼容和適配,所有轉化操作都可以基於Instant對象進行,下面使用LocalDateTime進行演示
- 時間戳轉LocalDate,LocalDate,LocalDateTime
long timestamp = Instant.now().toEpochMilli();
LocalDateTime localDateTime = Instant.ofEpochMilli(timestamp).atOffset(ZoneOffset.ofHours(8)).toLocalDateTime();
// 打印結果:2019-12-09T11:22:42.629
- LocalDate,LocalDate,LocalDateTime轉時間戳
LocalDateTime localDateTime = LocalDateTime.now();
long timestamp = localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
// 打印結果:1575861905995
- 兼容舊版本Date
LocalDateTime localDateTime3 = LocalDateTime.now();
Date date = Date.from(localDateTime3.atZone(ZoneOffset.ofHours(8)).toInstant());
LocalDateTime localDateTime4 = localDateTime3.atZone(ZoneOffset.ofHours(8)).toLocalDateTime();
// 打印結果 date:Mon Dec 09 11:30:04 CST 2019
// 打印結果 lcoalDateTime4:2019-12-09T11:30:04.470