前面我已經總結了Java8 Time API常用的一些方法、封裝的工具類,可是最近需要對一個比較老的項目進行重構,大致看了一下使用的Jdk還是7而且里面的時間工具類還是使用的Date和Calendar。既然是項目重構,我的第一想法是Jdk版本必須得升一升,和同事商量后還是決定使用Java8(本人比較看好Java 9中的HTTP/2,奈何9版本廣受詬病,而10中局部變量類型推斷對於習慣於強類型定義的Javaer還是一時半會難以接收,最終還是選擇了Java8),另外Spring項目也該換成Spring cloud微服務項目了吧(聽說最近Spring cloud alibaba大火,有空去研究研究.)。呃,有點跑遠了,還是回到我們主題,來介紹一下Date如何轉換成Java8 Time API吧。
在Java官方社區里面了解到,Time API提供了方法將Date轉換為LocalDate,不過並非直接轉換,而是通過ZonedDateTime。
下面我先來詳細的介紹Date轉換成LocalDate的方法
1)將java.util.Date轉換為ZonedDateTime。
2)使用它的toLocalDate()方法從ZonedDateTime獲取LocalDate。
代碼示例
public static void main(String[] args) { Date date = new Date(); Instant instant = date.toInstant(); ZoneId zoneId = ZoneId.systemDefault(); // atZone()方法返回在指定時區從此Instant生成的ZonedDateTime。 LocalDate localDate = instant.atZone(zoneId).toLocalDate(); System.out.println("Date = " + date); System.out.println("LocalDate = " + localDate); }
----------------------
Date = Fri Jun 16 15:29:05 CST 2017
LocalDate = 2017-06-16
LocalDate轉換為Date的方法
1)使用ZonedDateTime將LocalDate轉換為Instant。
2)使用from()方法從Instant對象獲取Date的實例
代碼示例
public static void main(String[] args) { ZoneId zoneId = ZoneId.systemDefault(); LocalDate localDate = LocalDate.now(); ZonedDateTime zdt = localDate.atStartOfDay(zoneId); Date date = Date.from(zdt.toInstant()); System.out.println("LocalDate = " + localDate); System.out.println("Date = " + date); } ---------------------- LocalDate = 2017-06-16 Date = Fri Jun 16 00:00:00 CST 2017
ps:最后補充一個能很好展示新舊API轉換的工具類
/** * 獲取本周開始日期 * time Date格式 * * @return LocalDate格式 */ public static LocalDate getFirstDayOfWeek(Date time) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); //設置時間格式 DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");//設置時間格式 Calendar cal = Calendar.getInstance(); cal.setTime(time); int dayWeek = cal.get(Calendar.DAY_OF_WEEK);//獲得當前日期是一個星期的第幾天 if (1 == dayWeek) { cal.add(Calendar.DAY_OF_MONTH, -1); } cal.setFirstDayOfWeek(Calendar.MONDAY); int day = cal.get(Calendar.DAY_OF_WEEK);//獲得當前日期是一個星期的第幾天 cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);//根據日歷的規則,給當前日期減去星期幾與一個星期第一天的差值 LocalDate date = LocalDate.parse(sdf.format(cal.getTime()),dtf); return date; }