Java 8 日期時間組件

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

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

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

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

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

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

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

最新JDBC映射將把數據庫的日期類型和Java 8的新類型關聯起來:

SQL -> Java
--------------------------
date -> LocalDate
time -> LocalTime
timestamp -> LocalDateTime

不再會出現映射到java.util.Date其中日期或時間某些部分爲0的狀況了。

後續待補充。。。

相關文章
相關標籤/搜索