jdk8引入了全新的日期和時間組件,並把它們概括到一系列的包下。核心包java.time使用的歷法採用ISO-8601標準,固然,咱們也可使用java.time.chrono包中的一些非標準的歷法,好比日本帝國曆法(天皇年號)、泰國佛教曆法(佛陀誕生)、中華民國曆法(辛亥革命)、伊斯蘭黑蚩拉曆法。java.time.format提供日期的格式化和轉換。注意,新的API操做都是線程安全的,由於新的日期API類都是final修飾而不可變的,若是遇到加減運算及格式化操做,本質上會建立新的實例。java
java.time包內,有幾個比較重要的組件:sql
Instant(時間戳)數據庫
LocalDate(日期)安全
LocalTime(時間)spa
LocalDateTime(日期時間)線程
ZonedDateTime(帶有區域信息的日期時間,好比中國默認使用的是東八區)設計
Period(如兩個日期之間相差的天數)code
Druation(兩個日期時間之間間隔的秒和納秒)orm
Instant本質上是一個數字時間戳,底層其實是對System.currentTimeMillis()進行了包裝。字符串
Instant now = Instant.now(); System.out.println(now.toString()); // 毫秒 System.out.println(now.get(ChronoField.MILLI_OF_SECOND)); // 微秒,只是用毫秒數除以1000 System.out.println(now.get(ChronoField.MICRO_OF_SECOND)); // 納秒,只是用毫秒數除以1000_000 System.out.println(now.get(ChronoField.NANO_OF_SECOND)); // 毫秒轉Instant LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()); // 2018-06-16T23:12:01 System.out.println(localDateTime);
LocalDate格式:2017-06-04,相似於java.sql.Date,不包含時間。1.8以前的java.lang.Date是包含時間的,因此從結構上看,1.8以前的設計有些糟糕。
// 得到當前日期 LocalDate now = LocalDate.now(); System.out.println(now.toString()); // 日期加上1天 LocalDate localDate2 = now.plusDays(1); System.out.println(localDate2.toString()); // 日期加上一週 LocalDate localDate3 = now.plusWeeks(1); System.out.println(localDate3); // 計算當前年的第52天是幾月幾號 System.out.println("今年的第52天 = " + now.withDayOfYear(52)); // 字符串轉日期 DateTimeFormatter strToDateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); TemporalAccessor dateTemporal = strToDateFormatter.parse("2017-01-01"); LocalDate date = LocalDate.from(dateTemporal); System.out.println(date); // 格式化日期 DateTimeFormatter dateToStrFormatter = DateTimeFormatter.ofPattern("yyyyMMdd"); String dateStr = dateToStrFormatter.format(now); System.out.println(dateStr);
LocalTime格式爲13:01:02.221,在只須要處理時間的場景下,它變得很是有用。
LocalTime localTime = LocalTime.now(); System.out.println("local time = " + localTime); System.out.println("plus 12 hours = " + localTime.plusHours(12));
LocalDateTime本質上有LocalDate和LocalTime組成。
// 得到當前日期時間 LocalDateTime now = LocalDateTime.now(); System.out.println(now); // 字符串轉日期時間。 DateTimeFormatter strToDateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); TemporalAccessor dateTemporal = strToDateFormatter.parse("2017-01-01 12:12:13"); LocalDate date = LocalDate.from(dateTemporal); System.out.println(date); // 格式化日期時間 DateTimeFormatter dateToStrFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); String dateStr = dateToStrFormatter.format(now); System.out.println(dateStr);
Period表明的是兩個日期之間的天、月、年數差值,固然,咱們也能夠直接使用日期中的until方法來完成一樣的效果。
LocalDate startDate = LocalDate.now(); LocalDate endDate = startDate.plusDays(1); Period period = Period.between(startDate, endDate); System.out.println("間隔的天數" + period.getDays()); System.out.println("間隔的月數:" + period.getMonths()); System.out.println("間隔的年數:" + period.getYears()); // 直接使用日期類中的方法計算日期間隔 long days = startDate.until(endDate, ChronoUnit.DAYS); System.out.println("間隔的天數:" + days); long weeks = startDate.until(endDate, ChronoUnit.WEEKS); System.out.println("間隔的週數:" + weeks);
Duration表示的是兩個日期時間間隔的秒以及納秒數。
LocalDateTime start = LocalDateTime.now(); LocalDateTime end = start.plusDays(1); Duration duration = Duration.between(start, end); System.out.println("間隔的秒數:" + duration.get(ChronoUnit.SECONDS)); System.out.println("間隔的納秒數:" + duration.get(ChronoUnit.NANOS));
最新JDBC映射將把數據庫的日期類型和Java 8的新類型關聯起來:
SQL -> Java -------------------------- date -> LocalDate time -> LocalTime timestamp -> LocalDateTime
不再會出現映射到java.util.Date其中日期或時間某些部分爲0的狀況了。
後續待補充。。。