为什么我们需要新的 Java Date Time API?
在我们开始查看 Java 8 Date Time API 之前,让我们看看为什么我们需要一个新的 API。java 中现有的日期和时间相关类存在一些问题,其中一些是:
- Java Date Time 类没有一致定义,我们在包
java.util
和java.sql
包中都有 Date Class 。再次格式化和解析类在java.text
包中定义。 java.util.Date
包含日期和时间,而java.sql.Date
仅包含日期。java.sql
包装中的这个没有意义。这两个类都有相同的名称,这本身就是一个非常糟糕的设计。- 时间,时间戳,格式和解析没有明确定义的类。我们有
java.text.DateFormat
用于解析和格式化需求的抽象类。通常SimpleDateFormat
类用于解析和格式化。 - 所有 Date 类都是可变的,因此它们不是线程安全的。这是 Java Date 和 Calendar 类的最大问题之一。
- 日期类不提供国际化,没有时区支持。所以
java.util.Calendar
和java.util.TimeZon
类进行了介绍,但他们也有上面列出的所有问题。
总结起来一句话,新的 Java Date Time API 更安全。
Jdk8 改革
LocalDateTime 获取毫秒数
//获取秒数 Long second = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8")); //获取毫秒数 Long milliSecond = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
LocalDateTime 与 String 互转
//时间转字符串格式化 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"); String dateTime = LocalDateTime.now(ZoneOffset.of("+8")).format(formatter);
字符串转时间
String dateTimeStr = "2018-07-28 14:11:15"; DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime dateTime = LocalDateTime.parse(dateTimeStr, df);
Date 与 LocalDateTime 互转
//将java.util.Date 转换为java8 的java.time.LocalDateTime,默认时区为东8区 public static LocalDateTime dateConvertToLocalDateTime(Date date) { return date.toInstant().atOffset(ZoneOffset.of("+8")).toLocalDateTime(); } //将java8 的 java.time.LocalDateTime 转换为 java.util.Date,默认时区为东8区 public static Date localDateTimeConvertToDate(LocalDateTime localDateTime) { return Date.from(localDateTime.toInstant(ZoneOffset.of("+8"))); }
将 LocalDateTime 转为自定义的时间格式的字符串
public static String getDateTimeAsString(LocalDateTime localDateTime, String format) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format); return localDateTime.format(formatter); }
将某时间字符串转为自定义时间格式的 LocalDateTime
public static LocalDateTime parseStringToDateTime(String time, String format) { DateTimeFormatter df = DateTimeFormatter.ofPattern(format); return LocalDateTime.parse(time, df); }
将 long 类型的 timestamp 转为 LocalDateTime
public static LocalDateTime getDateTimeOfTimestamp(long timestamp) { Instant instant = Instant.ofEpochMilli(timestamp); ZoneId zone = ZoneId.systemDefault(); return LocalDateTime.ofInstant(instant, zone); }
将 LocalDateTime 转为 long 类型的 timestamp
public static long getTimestampOfDateTime(LocalDateTime localDateTime) { ZoneId zone = ZoneId.systemDefault(); Instant instant = localDateTime.atZone(zone).toInstant(); return instant.toEpochMilli(); }
对于这个新 API,一些最常用的类将是 LocalDate 和 LocalDateTime。
非常容易使用,并且具有类似的方法,可以轻松找到特定的工作。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于