前言
java 8 中引入的兩個與日期相關的新類:Period 和 Duration。兩個類看表示時間量或兩個日期之間的差,兩者之間的差異為: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); Log.e(TAG, "onClick: 天數="+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);//用傳入為單位秒的時間戳創建 Instant instant4 = Instant.EPOCH; //獲取一個1970紀元年0時的時間
以上代碼都是創建了某個時間點的值
Duration
Duration字面意思是持續時間, 注意! 在Android中使用,因為Duration是Java 8才引入的,使用Android需要最低API26才能使用
設置指定單位的持續時間
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 = 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 Log.e(TAG, "timeHours時間="+timeHours); Log.e(TAG, "timeMinutes時間="+timeMinutes); Log.e(TAG, "timeMillis時間="+timeMillis); Log.e(TAG, "timeNanos時間="+timeNanos); Log.e(TAG, "timeString時間="+timeString);
結果:
2019-09-29 15:27:33.942 28862-28862/demo_nav.yt.com.demo_nav E/demo.yt.com.demo.MainActivity: timeHours時間=24
2019-09-29 15:27:33.942 28862-28862/demo_nav.yt.com.demo_nav E/demo.yt.com.demo.MainActivity: timeMinutes時間=1440
2019-09-29 15:27:33.942 28862-28862/demo_nav.yt.com.demo_nav E/demo.yt.com.demo.MainActivity: timeMillis時間=86400000
2019-09-29 15:27:33.942 28862-28862/demo_nav.yt.com.demo_nav E/demo.yt.com.demo.MainActivity: timeNanos時間=86400000000000
2019-09-29 15:27:33.942 28862-28862/demo_nav.yt.com.demo_nav E/demo.yt.com.demo.MainActivity: timeString時間=PT24H
獲取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); Log.e(TAG, "onClick: 天數="+duration.toDays());
結果:
2019-09-29 16:33:38.063 1830-1830/demo_nav.yt.com.demo_nav E/demo.yt.com.demo.MainActivity: onClick: 天數=1
注意這個天數是可以負數,意味着如果開始時間比結束時間更后面就會得到負數天數
end