引言
Java 8 中引入了兩個與日期相關的新類:
-
Period :基於日期值
-
Duration:基於時間值
它們最大的作用就不需要你自己復雜的計算關於兩個年月日之間的相差的時間或日期啦.
Period 類與 Duration 類都是一段持續時間的概念,如果需要對比時間,它們就需要一個固定的時間值,所以就需要 LocalDate 類與 Instant 類來配合它們使用:
-
Period 對應使用 LocalDate ,它們的作用范圍域都是日期(年/月/日)
-
Duration 對應使用 Instant,它們的作用范圍域都是時間(天/時/分/秒/毫秒/納秒)
LocalDate
精度到日期記錄固定時間值的LocalDate,創建方式:
LocalDate localDate1 = LocalDate.of(2019,9,1);
LocalDate localDate2 = LocalDate.ofYearDay(2019,150);
Period
對比時間
LocalDate start = LocalDate.of(2019,9,25);
LocalDate end = LocalDate.of(2019,9,29);
Period period = Period.between(start, end);
System.out.println("相差天數="+period.getDays());
Instant
以精度到納秒記錄固定的時間值的Instant,創建方式:
Instant instant1 = Instant.parse("2017-10-03T10:15:30.00Z");//用解析字符串的形式創建
Instant instant2 = Instant.ofEpochMilli(System.currentTimeMillis());//用傳入單位為毫秒的時間戳創建
Instant instant3 = Instant.ofEpochSecond(System.currentTimeMillis()/1000);//用傳入為單位秒的
以上代碼都是創建了某個時間點的值
Duration
Duration字面意思是持續時間
- 設置指定單位的持續時間
Duration durationDays = Duration.ofDays(1);//天
Duration durationHours = Duration.ofHours(1);//小時
Duration durationMinutes = Duration.ofMinutes(1);//分
Duration durationSeconds = Duration.ofSeconds(1);//秒
Duration durationMillis = Duration.ofMillis(1);//毫秒
- 獲取指定單位的持續時間
Duration duration = Duration.ofDays(1);//設置一天時間
long timeHours = duration.toHours();//小時
long timeMinutes = duration.toMinutes();//分鍾
long timeMillis = duration.toMillis();//毫秒
long timeNanos = duration.toNanos();//納秒
String timeString = duration.toString(); //此持續時間的字符串表示形式,使用基於ISO-8601秒*的表示形式,例如 PT8H6M12.345S
System.out.println("timeHours時間="+timeHours);
System.out.println("timeMinutes時間="+timeMinutes);
System.out.println("timeMillis時間="+timeMillis);
System.out.println("timeNanos時間="+timeNanos);
System.out.println("timeString時間="+timeString);
- 獲取2個時間點之間差值的持續時間
long todayTimeMillis = System.currentTimeMillis();
long yesterdayTimeMillis = todayTimeMillis - 24 * 60 * 60 * 1000;
Instant start = Instant.ofEpochMilli(yesterdayTimeMillis);
Instant end = Instant.ofEpochMilli(todayTimeMillis);
Duration duration = Duration.between(start, end);
System.out.println("天數="+duration.toDays());
注意這個天數是可以負數,意味着如果開始時間比結束時間更后面就會得到負數天數