使用實例
import java.time.DayOfWeek;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.Period;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.Set;
import org.junit.Test;
public class TestLocalDateTime {
/**
* LocalDate、LocalTime、LocalDateTime
*
* from 依據傳入的 Temporal 對象創建對象實例
* now 依據系統時鍾創建 Temporal 對象
* of 由 Temporal 對象的某個部分創建該對象的實例
* parse 由字符串創建 Temporal 對象的實例
* atOffset 將 Temporal 對象和某個時區偏移相結合
* atZone 將 Temporal 對象和某個時區相結合
* format 使用某個指定的格式器將Temporal對象轉換為字符串(Instant類不提供該方法)
* get 讀取 Temporal 對象的某一部分的值
* minus 創建 Temporal 對象的一個副本,通過將當前 Temporal 對象的值減去一定的時長創建該副本
* plus 創建 Temporal 對象的一個副本,通過將當前 Temporal 對象的值加上一定的時長創建該副本
* with 以該 Temporal 對象為模板,對某些狀態進行修改創建該對象的副本
*/
@Test
public void test1() {
// 獲取時間
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);
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());
// 指定時間
LocalDateTime ldt2 = LocalDateTime.of(2020, 1, 2, 8, 10, 0);
System.out.println(ldt2);
// 加上時間
LocalDateTime ldt3 = ldt2.plusYears(20);
System.out.println(ldt3);
// 減去時間
LocalDateTime ldt4 = ldt2.minusMonths(2);
System.out.println(ldt4);
}
/**
* TemporalAdjuster 時間校正器
*
* TemporalAdjusters工具類方法:
* dayOfWeekInMonth 創建一個新的日期,它的值為同一個月中每一周的第幾天
* firstDayOfMonth 創建一個新的日期,它的值為當月的第一天
* firstDayOfNextMonth 創建一個新的日期,它的值為下月的第一天
* firstDayOfNextYear 創建一個新的日期,它的值為明年的第一天
* firstDayOfYear 創建一個新的日期,它的值為當年的第一天
* firstInMonth 創建一個新的日期,它的值為同一個月中,第一個符合星期幾要求的值
* lastDayOfMonth 創建一個新的日期,它的值為當月的最后一天
* lastDayOfNextMonth 創建一個新的日期,它的值為下月的最后一天
* lastDayOfNextYear 創建一個新的日期,它的值為明年的最后一天
* lastDayOfYear 創建一個新的日期,它的值為今年的最后一天
* lastInMonth 創建一個新的日期,它的值為同一個月中,最后一個符合星期幾要求的值
* next/previous 創建一個新的日期,並將其值設定為日期調整后或者調整前,第一個符合指定星期幾要求的日期
* nextOrSame/previousOrSame 創建一個新的日期,並將其值設定為日期調整后或者調整前,第一個符合指定星期幾要求的日期,如果該日期已經符合要求,直接返回該對象
*/
@Test
public void test2() {
// 獲取時間
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);
// 修改時間
LocalDateTime ldt2 = ldt.withDayOfMonth(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);
}
/**
* Instant 時間戳(使用 Unix 元年 1970年1月1日 00:00:00 所經歷的毫秒值)
*/
@Test
public void test3() {
// 默認使用 UTC 時區
Instant ins1 = Instant.now();
System.out.println(ins1);
// 設置時區偏移量
OffsetDateTime odt = ins1.atOffset(ZoneOffset.ofHours(8));
System.out.println(odt);
// 獲取秒值
System.out.println(ins1.getEpochSecond());
System.out.println(ins1.toEpochMilli());
// 設置秒值
Instant ins2 = Instant.ofEpochSecond(5);
System.out.println(ins2);
}
/**
* Duration 用於計算兩個“時間”間隔
* Period 用於計算兩個“日期”間隔
*/
@Test
public void test4() {
// 計算兩個“時間”間隔
Instant ins1 = Instant.now();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
Instant ins2 = Instant.now();
Duration duration = Duration.between(ins1, ins2);
System.out.println(duration);
System.out.println(duration.getSeconds());
System.out.println(duration.toMillis());
System.out.println("----------------------------------");
// 計算兩個“日期”間隔
LocalDate ld1 = LocalDate.of(2018, 1, 1);
LocalDate ld2 = LocalDate.now();
Period pe = Period.between(ld1, ld2);
System.out.println(pe.getYears());
System.out.println(pe.getMonths());
System.out.println(pe.getDays());
}
/**
* DateTimeFormatter 解析和格式化日期或時間
*/
@Test
public void test5() {
//DateTimeFormatter dtf = DateTimeFormatter.ISO_DATE;
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss E");
LocalDateTime ldt = LocalDateTime.now();
String date = ldt.format(dtf);
System.out.println(date);
LocalDateTime ldt2 = ldt.parse(date, dtf);
System.out.println(ldt2);
}
/**
* 獲取所有可用時區
*/
@Test
public void test6() {
Set<String> set = ZoneId.getAvailableZoneIds();
set.forEach(System.out::println);
}
/**
* 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);
}
}
與傳統日期處理的轉換
