JAVA 8 引入新時間API原因是原來的Date類無法支持多線程操作,新時間API支持多線程操作,當java.time包內時間類其值發生改變時,其如同String類,類的實例是不可變的對象,當改變其值的時候就會新生成對象地址,從而改變其對象地址,以保證支持多線程操作。
新的java.time包內類默認均採用ISO-8601時區標準
<給計算機看的時間>
Instant 時間戳 在時間線上的瞬間點 在ISO- 2007-12-03T10:15:30
-> 2007-12-03T10:15:30 .000Z。
<自己使用的日期時間>
LocalDate 在ISO- 2007-12-03 -> 2007-12-03 。
LocalDateTime 在ISO- 2007-12-03T10:15:30 -> 2007-12-03T10:15:30 。
LocalTime 在ISO- 10:15:30 -> 10:15:30 。
Duration 和Period
Duration:用於計算兩個“時間”間隔
Period:用於計算兩個“日期”間隔
package java8.time;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Period;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import java.util.Set;
import org.junit.Test;
public class Demo {
/**
* 計算時間差
*/
@Test
public void test1() {
Instant time1 = Instant.now(); // 獲取系統當前
System.out.println(time1);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Instant time2 = Instant.now();// 獲取休眠後系統時間
Duration duration = Duration.between(time1, time2);
// 計算兩個時間的差值
System.out.println(duration.toMillis());
}
@Test
public void test2() {
LocalDateTime time1 = LocalDateTime.now();
System.out.println(time1);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
LocalDateTime time2 = LocalDateTime.now();
Duration duration = Duration.between(time1, time2);
System.out.println(duration.toMillis());
}
/*
* 計算兩日期相差時間
*/
@Test
public void test3() {
LocalDate date1 = LocalDate.now();
LocalDate date2 = date1.plusDays(5);
Period period = Period.between(date1, date2);
System.out.println(period.getDays());
}
/*
* 輸入指定日期 按照指定日期格式輸出 默認採用ISO-8601日曆系統
*/
@Test
public void test4() {
LocalDateTime time = LocalDateTime.of(1997, 06, 13, 12, 59, 0);
time = time.plusMinutes(1);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd : hh:mm:ss");
String formatTime = formatter.format(time);
System.out.println(formatTime);
}
/*
* 修改默認日期格式
*/
@Test
public void test5() {
// 獲取所有日期格式
Set<String> set = ZoneId.getAvailableZoneIds();
// 獲取所有亞洲國家時區
set.stream().filter(e -> e.startsWith("Asia")).forEach(System.out::println);
LocalDateTime time = LocalDateTime.now(ZoneId.of("Asia/Hong_Kong"));
// format 第二個參數 指定國家
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd : hh:mm:ss", Locale.CHINA);
System.out.println(formatter.format(time));
System.out.println(time);
}
}