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 获取系统当前时间

或返回 Java 8 中的新特性

或查看 Java 8 中的其他新特性:

  1. Lambda 表达式
  2. 函数式接口
  3. 注解的新能力
  4. 方法引用
  5. 默认方法
  6. 流接口
  7. 新的日期时间接口
  8. Nashorn, JavaScript 引擎 (已在 Java 11 中弃用)
  9. Optional 类