新時間日期 API(java.time包)
使用 LocalDate、LocalTime、LocalDateTime(人讀的時間)
LocalDate、LocalTime、LocalDateTime 類的實 例是不可變的對象,是線程安全的
分別表示使用 ISO-8601日曆系統的日期、時間、日期和時間。它們提供了簡單的日期或時間,
並不包含當前的時間信息。也不包含與時區相關的信息。
注:ISO-8601日曆系統是國際標準化組織制定的現代公民的日期和時間的表示法
Instant 時間戳(機器讀的時間)
用於“時間戳”的運算。它是以Unix元年(傳統 的設定爲UTC時區1970年1月1日午夜時分)開始
所經歷的描述進行運算
Duration 和 Period
Duration:用於計算兩個“時間”間隔
Period:用於計算兩個“日期”間隔
日期的操
TemporalAdjuster : 時間校正器。有時我們可能需要獲 取例如:將日期調整到“下個週日”等操作。
TemporalAdjusters : 該類通過靜態方法提供了大量的常 用 TemporalAdjuster 的實現。
解析與格式化
java.time.format.DateTimeFormatter 類:該類提供了三種 格式化方法:
預定義的標準格式
語言環境相關的格式
自定義的格式
時區的處理
Java8 中加入了對時區的支持,帶時區的時間爲分別爲:
ZonedDate、ZonedTime、ZonedDateTime
其中每個時區都對應着 ID,地區ID都爲 “{區域}/{城市}”的格式
例如 :Asia/Shanghai 等
ZoneId:該類中包含了所有的時區信息
getAvailableZoneIds() : 可以獲取所有時區時區信息
of(id) : 用指定的時區信息獲取 ZoneId 對象
public class TestLocalDateTime {
//1. LocalDate、LocalTime、LocalDateTime
@Test
public void test1() {
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);
LocalDateTime ld2 = LocalDateTime.of(2016, 11, 21, 10, 10, 10);
System.out.println(ld2);
LocalDateTime ldt3 = ld2.plusYears(2);//加兩年
System.out.println(ldt3);
LocalDateTime ldt4 = ld2.minusMonths(2);//減去兩個月
System.out.println(ldt4);
System.out.println(ldt.getYear());
System.out.println(ldt.getMonthValue());
System.out.println(ldt.getDayOfMonth());
System.out.println(ldt.getHour());
System.out.println(ldt.getMinute());
System.out.println(ldt.getSecond());
}
//2. Instant : 時間戳。 (使用 Unix 元年 1970年1月1日 00:00:00 所經歷的毫秒值)
@Test
public void test2() {
Instant ins = Instant.now(); //默認使用 UTC 時區
System.out.println(ins);
OffsetDateTime odt = ins.atOffset(ZoneOffset.ofHours(8));//加8個時區
System.out.println(odt);
System.out.println(ins.toEpochMilli());//時間戳
System.out.println(ins.getNano());
Instant ins2 = Instant.ofEpochSecond(5);//1970-01-01T00:00:05Z 1970-01-01T00:00:00加5秒
System.out.println(ins2);
}
//3.
//Duration : 用於計算兩個“時間”間隔
//Period : 用於計算兩個“日期”間隔
@Test
public void test3() {
Instant ins1 = Instant.now();
System.out.println("--------------------");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
Instant ins2 = Instant.now();
System.out.println("所耗費時間爲:" + Duration.between(ins1, ins2));
System.out.println("----------------------------------");
LocalDate ld1 = LocalDate.now();
LocalDate ld2 = LocalDate.of(2011, 1, 1);
Period pe = Period.between(ld2, ld1);
System.out.println(pe.getYears());
System.out.println(pe.getMonths());
System.out.println(pe.getDays());
}
//4. TemporalAdjuster : 時間校正器
@Test
public void test4() {
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);
LocalDateTime ldt2 = ldt.withDayOfMonth(10);//將月中的天指定爲10號
System.out.println(ldt2);
LocalDateTime ldt3 = ldt.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));//下個星期日
System.out.println(ldt3);
//自定義:下一個工作日
LocalDateTime ldt5 = ldt.with((l) -> {
LocalDateTime ldt4 = (LocalDateTime) l;
DayOfWeek dow = ldt4.getDayOfWeek();
if (dow.equals(DayOfWeek.FRIDAY)) {
return ldt4.plusDays(3);
} else if (dow.equals(DayOfWeek.SATURDAY)) {
return ldt4.plusDays(2);
} else {
return ldt4.plusDays(1);
}
});
System.out.println(ldt5);
}
//5. DateTimeFormatter : 解析和格式化日期或時間
@Test
public void test5() {
// DateTimeFormatter dtf = DateTimeFormatter.ISO_LOCAL_DATE;
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss E");
LocalDateTime ldt = LocalDateTime.now();
String strDate = ldt.format(dtf);
System.out.println(strDate);
LocalDateTime newLdt = ldt.parse(strDate, dtf);
System.out.println(newLdt);
}
@Test//獲取所有時區時區信息
public void test6() {
Set<String> set = ZoneId.getAvailableZoneIds();
set.forEach(System.out::println);
}
//6.ZonedDate、ZonedTime、ZonedDateTime : 帶時區的時間或日期
@Test
public void test7(){
LocalDateTime ldt = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
System.out.println(ldt);
ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("US/Pacific"));
System.out.println(zdt);
}
}