1. 程式人生 > >java 8 日期API

java 8 日期API

Java 8 中的日期API 相比以前更為簡潔,辨識度高,而且都是執行緒安全的。掌握常用的時間類方法有時可以節省許多額外的工作。關於各個類的介紹可以參考Java 8新特性(四):新的時間和日期API

值得注意的是,LocalTime 、LocalDate與LocalDateTime類的構造器都是private,這裡用了靜態工廠方法(static factory methods) 。靜態工廠方法相比傳統的構造器有如下優點(參考Effective Java第二版):

  1. 靜態工廠方法在方法命名上更具有可讀性
  2. 靜態工廠方法可以在被呼叫的時候返回同一個物件,而不是每次都構建一個新的物件
  3. 靜態工廠方法可以返回該型別的子類物件
  4. 靜態工廠方法可以簡化引數化型別的物件建立
關於第四點,Java 7 已經開始支援泛型型別推導,並在Java 8 中得到了完善(Java8中對泛型目標型別推斷方法的改進)。

下面是應用新的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