Java 8 中的新特性: 新的时间/日期接口
Java 8 新的获取和处理时间的方法
Java 8 通过发布新的新的日期/时间接口 (JSR 310) 来进一步加强对日期与时间的处理, 借以改善 线程安全, 设计混乱, 时区转换麻烦 等问题.
处理时间, 主要是其中涉及到语言(周,月字符串), 时区(各个不同时区返回的时间应该不一样)的概念, 详情及示例代码如下:
import java.time.Clock; import java.time.DayOfWeek; import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.Month; import java.time.ZoneId; import java.time.format.TextStyle; import java.util.Locale; public class Yi21DateDemo { public static void main(String[] args) { // 获取当地时间, 采用系统时区 LocalDateTime localTime1 = LocalDateTime.now(); System.out.println("当地时间: " + localTime1); // 通过时区偏移获取当地时间, 480分钟意味着8小时, UTC+8小时就是中国的时区了 LocalDateTime localTime2 = LocalDateTime.now(Clock.offset(Clock.systemUTC(), Duration.ofMinutes(480))); System.out.println("偏移时间: " + localTime2); // 通过时区字符串获取当地时间 // PRC 表示中国, 我们同样可以使用 Asia/Shanghai, Asia/Chongqing, Asia/Macau 来找到中国的时区, 但是奇怪的是 Asia/Hongkong 却无效. // 使用版本: Liberica Openjdk version "11.0.10" 2021-01-19 LTS LocalDateTime localTime3 = LocalDateTime.now(ZoneId.of("PRC")); System.out.println("时区时间: " + localTime3); //转换为当地日期对象 LocalDate localDate = localTime1.toLocalDate(); System.out.println("当地日期: " + localDate); //获取各项单位时间 int y = localTime1.getYear(); int m = localTime1.getMonthValue(); int d = localTime1.getDayOfMonth(); int h = localTime1.getHour(); int i = localTime1.getMinute(); int s = localTime1.getSecond(); System.out.println(String.format("%d年%d月%d日 %d:%d:%d", y, m, d, h, i, s)); //周的操作 DayOfWeek w = localTime1.getDayOfWeek(); int wVal = w.getValue(); System.out.println(String.format("[基础]数字: %d, 强制转换: %s", wVal, w)); //周的操作 - 英语结果 String wNarrowEn = w.getDisplayName(TextStyle.NARROW, Locale.forLanguageTag("EN")); String wShortEn = w.getDisplayName(TextStyle.SHORT, Locale.forLanguageTag("EN")); String wFullEn = w.getDisplayName(TextStyle.FULL, Locale.forLanguageTag("EN")); System.out.println(String.format("[英文]窄: %s, 短: %s, 长:%s", wNarrowEn, wShortEn, wFullEn)); //周的操作 - 本地化(中文)结果 String wNarrowLocal = w.getDisplayName(TextStyle.SHORT, Locale.getDefault()); String wShortLocal = w.getDisplayName(TextStyle.SHORT, Locale.getDefault()); String wFullLocal = w.getDisplayName(TextStyle.SHORT, Locale.getDefault()); System.out.println(String.format("[本地化]窄: %s, 短: %s, 长:%s", wNarrowLocal, wShortLocal, wFullLocal)); //月的操作 Month month = localTime1.getMonth(); System.out.println(month); //替换 localTime1 中的部分单位时间 LocalDateTime replacedLocalTime = localTime1.withDayOfMonth(10).withYear(2049); System.out.println("部分日期替换: " + replacedLocalTime); //获取指定日期 LocalDate cny2021 = LocalDate.of(2021, Month.FEBRUARY, 12); System.out.println("辛丑年春节: " + cny2021); //0时0分 LocalTime timeZero = LocalTime.of(0, 0, 0); System.out.println("0点时分: " + timeZero); //0点过1秒, 转换成字符串相比略有差异 timeZero = LocalTime.of(0, 0, 1); System.out.println("0点过1秒: " + timeZero); // 解析时间字符串 LocalTime cctv = LocalTime.parse("19:00:00"); System.out.println("新闻联播时间: " + cctv); } }
使用细节请参照注释, 周和月获取展示名, 可以指定展示语言和长短形式, 这是几项很重要的特性.
执行结果如下:
当地时间: 2021-03-23T00:43:20.326347600 偏移时间: 2021-03-23T00:43:20.327325100 时区时间: 2021-03-23T00:43:20.327325100 当地日期: 2021-03-23 2021年3月23日 0:43:20 [基础]数字: 2, 强制转换: TUESDAY [英文]窄: T, 短: Tue, 长:Tuesday [本地化]窄: 周二, 短: 周二, 长:周二 MARCH 部分日期替换: 2049-03-10T00:43:20.326347600 辛丑年春节: 2021-02-12 0点时分: 00:00 0点过1秒: 00:00:01 新闻联播时间: 19:00
以上就是 Java 8 中新的日期/时间接口的全部内容了.
您还可以:
看看 Java 中其他获取时间和日期的方法:
或返回 Java 8 中的新特性
或查看 Java 8 中的其他新特性:
- Lambda 表达式
- 函数式接口
- 注解的新能力
- 方法引用
- 默认方法
- 流接口
- 新的日期时间接口
- Nashorn, JavaScript 引擎 (已在 Java 11 中弃用)
- Optional 类