为什么我们需要新的 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。
非常容易使用,并且具有类似的方法,可以轻松找到特定的工作。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于