JDK8新特性 - 新时间日期API

LocalDate、LocalTime、LocalDateTime

LocalDate、LocalTime、LocalDateTime 类的实例是不可变的对象,分别表示使用ISO-8601日历系统的日期、时间、日期和时间。它们提供了简单的日期或时间,并不包含当前的时间信息,也不包含与时区相关的信息。
注:ISO-8601日历系统是国际标准化组织制定的现代公民的日期和时间的表示法
在这里插入图片描述

基本使用
@Test
public void test1() {
	// 当前时间
	LocalDateTime now = LocalDateTime.now();
	System.out.println(now);
	
	// 指定时间 - 2020年4月29日16点43分33秒
	LocalDateTime ldt1 = LocalDateTime.of(2020,4,29,16,43,33);
	System.out.println(ldt1);
	
	// 时间增加 - 增加20年
	LocalDateTime ldt2 = ldt1.plusYears(20);
	System.out.println(ldt2);
	
	// 时间减少 - 减少2个月
	LocalDateTime ldt3 = ldt1.minusMonths(2);
	System.out.println(ldt3);
	
	// 打印年月日 时分秒
	System.out.println(now.getYear());
	System.out.println(now.getMonthValue());
	System.out.println(now.getDayOfMonth());
	System.out.println(now.getHour());
	System.out.println(now.getMinute());
	System.out.println(now.getSecond());
}

时间戳 - Instant

用于“时间戳”的运算,它是以Unix元年(传统的设定为UTC时区1970年1月1日午夜时分)开始所经历的描述进行运算。

@Test
public void test2() {
	// 使用 Unix 元年  1970年1月1日 00:00:00 所经历的毫秒值
	Instant ins = Instant.now(); // 默认使用UTC时区
	System.out.println(ins);
	
	OffsetDateTime odt = ins.atOffset(ZoneOffset.ofHours(8));  // 相差8个时区,进行偏移
	System.out.println(odt);
	System.out.println(ins.getNano());  // 毫秒值
	
	Instant ins2 = Instant.ofEpochSecond(5);   // 增加5秒
	System.out.println(ins2);
}

Duration 和 Period

Duration:用于计算两个时间间隔。
Period:用于计算两个日期间隔。

@Test
public void test3() {
	Instant ins1 = Instant.now();
	try {
		Thread.sleep(1000);
	}catch (Exception e) {
		e.printStackTrace();
	}
	Instant ins2 = Instant.now();
	System.out.println("相差时间间隔为:" + Duration.between(ins1, ins2));
	
	LocalDate ld1 = LocalDate.of(2016, 4, 1);
	LocalDate ld2 = LocalDate.now();
	Period period = Period.between(ld1, ld2);
	System.out.println("相差时间间隔为:" + period);
	System.out.println("年:" + period.getYears());
	System.out.println("月:" + period.getMonths());
	System.out.println("日:" + period.getDays());
}

在这里插入图片描述

日期的操纵

TemporalAdjuster : 时间校正器。有时我们可能需要获取例如:将日期调整到下个周日等操作。
TemporalAdjusters : 该类通过静态方法提供了大量的常用 TemporalAdjuster 的实现。

@Test
public void test4() {
	// 当前时间
	LocalDateTime ldt = LocalDateTime.now();
	System.out.println(ldt);

	// 这个月的10号
	LocalDateTime ldt2 = ldt.withDayOfMonth(10);
	System.out.println(ldt2);

	// 下个周日
	LocalDateTime ldt3 = ldt.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
	System.out.println(ldt3);

	// 自定义 - 下一个工作日
	LocalDateTime ldt5 = ldt.with(l -> {
		LocalDateTime ldt4 = (LocalDateTime) l;
		DayOfWeek dow = ldt4.getDayOfWeek();  // 这一天是周几
		if (dow.equals(DayOfWeek.FRIDAY)) { // 这一天是周五
			return ldt4.plusDays(3);
		} else if (dow.equals(DayOfWeek.SATURDAY)) { // 这一天是周六
			return ldt4.plusDays(2);
		} else {
			return ldt4.plusDays(1);
		}
	});
	System.out.println(ldt5);
}

解析与格式化

@Test
public void test5() {
	// 格式化格式
	DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
	
	LocalDateTime ldt = LocalDateTime.now();
	String strDate = ldt.format(dtf);
	System.out.println(strDate);
	// 转换回去
	LocalDateTime newLdt = ldt.parse(strDate,dtf);
	System.out.println(newLdt);
}

在这里插入图片描述

支持时区
@Test
public void test6(){
	Set<String> set = ZoneId.getAvailableZoneIds();
	set.forEach(System.out::println);
}
带时区的时间或日期
@Test
public void test7(){
	LocalDateTime ldt = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
	System.out.println(ldt);
	
	ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("US/Pacific"));
	System.out.println(zdt);
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值