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);
}
}