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的状况了。
后续待补充。。。