java 8 日期API
阿新 • • 發佈:2018-12-13
Java 8 中的日期API 相比以前更為簡潔,辨識度高,而且都是執行緒安全的。掌握常用的時間類方法有時可以節省許多額外的工作。關於各個類的介紹可以參考Java 8新特性(四):新的時間和日期API
值得注意的是,LocalTime 、LocalDate與LocalDateTime類的構造器都是private,這裡用了靜態工廠方法(static factory methods) 。靜態工廠方法相比傳統的構造器有如下優點(參考Effective Java第二版):
- 靜態工廠方法在方法命名上更具有可讀性
- 靜態工廠方法可以在被呼叫的時候返回同一個物件,而不是每次都構建一個新的物件
- 靜態工廠方法可以返回該型別的子類物件
- 靜態工廠方法可以簡化引數化型別的物件建立
下面是應用新的API寫的一些例子,基本能夠滿足日常需要。
public class NewTime {
public static void main(String[] args) {
//獲取當前日期時間
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
LocalDateTime dateTime = LocalDateTime.now().withNano(0);
System.out.printf("LocalDate.now()\tLocalTime.now():%s\t%s%n", date, time);
System.out.println("LocalDateTime.now().withNano(0):" + dateTime);
System.out.println("---------------------------------------------");
//獲取指定日期時間
LocalDate specDatefromString = LocalDate.parse("2014-12-12");
LocalDate specDate = LocalDate.of(2014, 2, 20);
System.out.println("LocalDate.parse(\"2014-2-2\"):" + specDatefromString);
System.out.println("LocalDate.of(2014,2,20):" + specDate);
specDate = LocalDate.ofYearDay(2015, 100);
int dayOfYear = LocalDate.now().getDayOfYear();
System.out.println("LocalDate.now().getDayOfYear():" + dayOfYear);
System.out.println("LocalDate.ofYearDay(2015,100):" + specDate);
specDate = LocalDate.ofEpochDay(200);//自1970年1月1日起200天后的日期
System.out.println("LocalDate.ofEpochDay(200):" + specDate);
System.out.println("---------------------------------------------");
//日期計算
LocalDate lastDayOfMonth = date.with(TemporalAdjusters.lastDayOfMonth());//不用考慮是28、29、30還是31天
System.out.println("date.with(TemporalAdjusters.lastDayOfMonth()):" + lastDayOfMonth);
LocalTime timeAfterPlus = time.plusMinutes(200);
LocalTime timeAfterMinus = time.minusHours(2);
Period period = Period.between(LocalDate.of(2014, 2, 10), date);//獲取兩個日期間的距離
System.out.println("time.plusMinutes(200):" + timeAfterPlus);
System.out.println("time.minusHours(2):" + timeAfterMinus);
System.out.println("Period.between(LocalDate.of(2014, 2, 10),date):" + period);
//2015年11月第一個週一
LocalDate firstMondayInOneYear = LocalDate.parse("2015-11-11").with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY));
System.out.println("LocalDate.parse(\"2015-11-11\").with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)):" + firstMondayInOneYear);
//日期判斷
LocalDate date1 = LocalDate.now();
System.out.println("date.equals(date1):" + date.equals(date1));
System.out.println("specDate.isBefore(date):" + specDate.isBefore(date));
System.out.println("----------------------------------------------");
//檢視時區
@SuppressWarnings("unused")
Set<String> allZone = ZoneId.getAvailableZoneIds();//獲得所有時區
ZoneId zone = ZoneId.systemDefault();
System.out.println("ZoneId.systemDefault():" + zone);
ZoneId zoneInUSA = ZoneId.of("America/New_York");
LocalTime timeInUSA = LocalTime.now(zoneInUSA);
System.out.println("LocalTime.now(zoneInUSA):" + timeInUSA);
System.out.println("-----------------------------------------------");
//自定義日期格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("YYYY MM dd");
System.out.println("DateTimeFormatter.ofPattern(\"YYYY MM dd\"):" + formatter.format(LocalDate.now()));
//判斷是否為閏年
System.out.println("date.isLeapYear():" + date.isLeapYear());
Instant timestamp = Instant.now(); //獲取時間戳
System.out.println("Instant.now():" + timestamp);
}
}
輸出結果:
LocalDate.now() LocalTime.now():2018-10-03 17:37:03.031831200
LocalDateTime.now().withNano(0):2018-10-03T17:37:03
---------------------------------------------
LocalDate.parse("2014-2-2"):2014-12-12
LocalDate.of(2014,2,20):2014-02-20
LocalDate.now().getDayOfYear():276
LocalDate.ofYearDay(2015,100):2015-04-10
LocalDate.ofEpochDay(200):1970-07-20
---------------------------------------------
date.with(TemporalAdjusters.lastDayOfMonth()):2018-10-31
time.plusMinutes(200):20:57:03.031831200
time.minusHours(2):15:37:03.031831200
Period.between(LocalDate.of(2014, 2, 10),date):P4Y7M23D
LocalDate.parse("2015-11-11").with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)):2015-11-02
date.equals(date1):true
specDate.isBefore(date):true
----------------------------------------------
ZoneId.systemDefault():Asia/Shanghai
LocalTime.now(zoneInUSA):05:37:03.155499400
-----------------------------------------------
DateTimeFormatter.ofPattern("YYYY MM dd"):2018 10 03
date.isLeapYear():false
Instant.now():2018-10-03T09:37:03.192400500Z