作为一个全新的 API,Java 日期和时间 API 不得不与已有的类之间互相操作,尤其是无处不在的 java.util.Date、java.util.GregorianCalendar 及 java.sql.Date、java.sql.Time、java.sql.Timestamp。
Instant 类类似于 java.util.Date 类。在 Java8 中,java.util.Date 类中增加了两个方法:toInstant 方法用来将一个 Date 对象转换为一个 Instant 对象,而静态方法 from 正好相反。例如:
// 将 Instant 转换为 Date 对象 Date date = Date.from(Instant.now()); System.out.println("date=" + date); // 将 Date 转换为 Instant 对象 Instant instant = date.toInstant(); System.out.println("instant=" + instant);
ZonedDateTime 类似于 java.util.GregorianCalendar 类,后者也在 Java8 中添加了一些转换方法。toZonedDateTime 方法可以将一个 GregorianCalendar 对象转换为一个 ZonedDateTime 对象,而静态方法 from 则可以进行反方向的转换。例如:
// 将 Instant 转换为 GregorianCalendar 对象 GregorianCalendar calendar = GregorianCalendar.from(ZonedDateTime.now()); System.out.println("calendar=" + calendar); // 将 GregorianCalendar 转换为 Instant 对象 ZonedDateTime zonedDateTime = calendar.toZonedDateTime(); System.out.println("zonedDateTime=" + zonedDateTime);
java.sql 包中的日期和时间类也都添加了各自的转换方法。例如:
// 创建一个 Instant 对象 Instant instant = Instant.now(); // 将 Instant 转换为 java.sql.Date java.util.Date sqlDate = java.sql.Date.from(instant); System.out.println("java.sql.Date from Instant: " + sqlDate); System.out.println(sqlDate.toInstant()); // 将 Instant 转换为 java.sql.Time java.util.Date sqlTime = java.sql.Time.from(instant); System.out.println("java.sql.Time from Instant: " + sqlTime); System.out.println(sqlTime.toInstant()); // 将 Instant 转换为 java.sql.Timestamp java.sql.Timestamp sqlTimestamp = java.sql.Timestamp.from(instant); System.out.println("java.sql.Timestamp from Instant: " + sqlTimestamp); System.out.println(sqlTimestamp.toInstant());
你还可以向使用 java.text.Format 的遗留代码传递一个 DateTimeFormatter 对象,用新的方式进行格式化。