JDK1.8新特性(3)接口新定义与日期

本文介绍了JDK1.8中接口的default和static关键字的使用,以及新的日期API LocalDate, LocalTime和LocalDateTime。接口新特性确保了1.8版本的向下兼容性,而日期API因其不可变性和线程安全性提供了更方便的日期时间操作。LocalDate、LocalTime分别用于表示日期和时间,LocalDateTime结合日期和时间,且新API的枚举表示月份和星期,比旧的Date接口更易用。" 97654824,8669663,DBAPI部署与错误排查,"['运维', '数据库', 'php']
摘要由CSDN通过智能技术生成

一、接口定义

在接口中可以使用default和static关键字来修饰接口中定义的普通方法

public interface Interface {
    default  String getName(){
        return "zhangsan";
    }

    static String getName2(){
        return "zhangsan";
    }
}

在JDK1.8中很多接口会新增方法,为了保证1.8向下兼容,1.7版本中的接口实现类不用每个都重新实现新添加的接口方法,引入了default默认实现,static的用法是直接用接口名去调方法即可。当一个类继承父类又实现接口时,若后两者方法名相同,则优先继承父类中的同名方法,即“类优先”,如果实现两个同名方法的接口,则要求实现类必须手动声明默认实现哪个接口中的方法。

二、新的日期API LocalDate | LocalTime | LocalDateTime

注意:新的日期API都是不可变的,更使用于多线程的使用环境中

public void test(){
    // 从默认时区的系统时钟获取当前的日期时间。不用考虑时区差
    LocalDateTime date = LocalDateTime.now();
    //2018-07-15T14:22:39.759
    System.out.println(date);

    System.out.println(date.getYear());
    System.out.println(date.getMonthValue());
    System.out.println(date.getDayOfMonth());
    System.out.println(date.getHour());
    System.out.println(date.getMinute());
    System.out.println(date.getSecond());
    System.out.println(date.getNano());

    // 手动创建一个LocalDateTime实例
    LocalDateTime date2 = LocalDateTime.of(2017, 12, 17, 9, 31, 31, 31);
    System.out.println(date2);
    // 进行加操作,得到新的日期实例
    LocalDateTime date3 = date2.plusDays(12);
    System.out.println(date3);
    // 进行减操作,得到新的日期实例
    LocalDateTime date4 = date3.minusYears(2);
    System.out.println(date4);
}
public void test2(){
	// 时间戳  1970年1月1日00:00:00 到某一个时间点的毫秒值
	// 默认获取UTC时区
	Instant ins = Instant.now();
	System.out.println(ins);
	
	System.out.println(LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli());
	System.out.println(System.currentTimeMillis());
	
	System.out.println(Instant.now().toEpochMilli());
	System.out.println(Instant.now().atOffset(ZoneOffset.ofHours(8)).toInstant().toEpochMilli());
}

public void test3(){
	// Duration:计算两个时间之间的间隔
	// Period:计算两个日期之间的间隔
	
	Instant ins1 = Instant.now();
	
	try {
		Thread.sleep(1000);
	} catch (InterruptedException e) {
		e.printStackTrace();
	}
	Instant ins2 = Instant.now();
	Duration dura = Duration.between(ins1, ins2);
	System.out.println(dura);
	System.out.println(dura.toMillis());
	
	System.out.println("======================");
	LocalTime localTime = LocalTime.now();
	try {
		Thread.sleep(1000);
	} catch (InterruptedException e) {
		e.printStackTrace();
	}
	LocalTime localTime2 = LocalTime.now();
	Duration du2 = Duration.between(localTime, localTime2);
	System.out.println(du2);
	System.out.println(du2.toMillis());
}
public void test5(){
	// temperalAdjust 时间校验器
	// 例如获取下周日  下一个工作日
	LocalDateTime ldt1 = LocalDateTime.now();
	System.out.println(ldt1);
	
	// 获取一年中的第一天
	LocalDateTime ldt2 = ldt1.withDayOfYear(1);
	System.out.println(ldt2);
	// 获取一个月中的第一天
	LocalDateTime ldt3 = ldt1.withDayOfMonth(1);
	System.out.println(ldt3);
	
	LocalDateTime ldt4 = ldt1.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
	System.out.println(ldt4);
	
	// 获取下一个工作日
	LocalDateTime ldt5 = ldt1.with((t) -> {
		LocalDateTime ldt6 = (LocalDateTime)t;
		DayOfWeek dayOfWeek = ldt6.getDayOfWeek();
		if (DayOfWeek.FRIDAY.equals(dayOfWeek)){
			return ldt6.plusDays(3);
		}
		else if (DayOfWeek.SATURDAY.equals(dayOfWeek)){
			return ldt6.plusDays(2);
		}
		else {
			return ldt6.plusDays(1);
		}
	});
	System.out.println(ldt5);
}
public void test6(){
	// DateTimeFormatter: 格式化时间/日期
	// 自定义格式
	LocalDateTime ldt = LocalDateTime.now();
	DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
	String strDate1 = ldt.format(formatter);
	String strDate = formatter.format(ldt);
	System.out.println(strDate);
	System.out.println(strDate1);
	
	// 使用api提供的格式
	DateTimeFormatter dtf = DateTimeFormatter.ISO_DATE;
	LocalDateTime ldt2 = LocalDateTime.now();
	String strDate3 = dtf.format(ldt2);
	System.out.println(strDate3);
	
	// 解析字符串to时间
	DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
	LocalDateTime time = LocalDateTime.now();
	String localTime = df.format(time);
	LocalDateTime ldt4 = LocalDateTime.parse("2017-09-28 17:07:05",df);
	System.out.println("LocalDateTime转成String类型的时间:"+localTime);
	System.out.println("String类型的时间转成LocalDateTime:"+ldt4);
}

表示日期的LocalDate
表示时间的LocalTime
表示日期时间的LocalDateTime

新的日期API的几个优点

  • 之前使用的java.util.Date月份从0开始,我们一般会+1使用,很不方便,java.time.LocalDate月份和星期都改成了enum
  • java.util.Date和SimpleDateFormat都不是线程安全的,而LocalDate和LocalTime和最基本的String一样,是不变类型,不但线程安全,而且不能修改。
  • java.util.Date是一个“万能接口”,它包含日期、时间,还有毫秒数,更加明确需求取舍
  • 新接口更好用的原因是考虑到了日期时间的操作,经常发生往前推或往后推几天的情况。用java.util.Date配合Calendar要写好多代码,而且一般的开发人员还不一定能写对。
  • LocalDate
public static void localDateTest() {

	//获取当前日期,只含年月日 固定格式 yyyy-MM-dd    2018-05-04
	LocalDate today = LocalDate.now();
	
	// 根据年月日取日期,5月就是5,
	LocalDate oldDate = LocalDate.of(2018, 5, 1);
	
	// 根据字符串取:默认格式yyyy-MM-dd,02不能写成2
	LocalDate yesteday = LocalDate.parse("2018-05-03");
	
	// 如果不是闰年 传入29号也会报错
	LocalDate.parse("2018-02-29");
}
  • LocalDate常用转化
public static void localDateTransferTest(){
	//2018-05-04
	LocalDate today = LocalDate.now();
	// 取本月第1天: 2018-05-01
	LocalDate firstDayOfThisMonth = today.with(TemporalAdjusters.firstDayOfMonth());
	// 取本月第2天:2018-05-02
	LocalDate secondDayOfThisMonth = today.withDayOfMonth(2);
	// 取本月最后一天,再也不用计算是28,29,30还是31: 2018-05-31
	LocalDate lastDayOfThisMonth = today.with(TemporalAdjusters.lastDayOfMonth());
	// 取下一天:2018-06-01
	LocalDate firstDayOf2015 = lastDayOfThisMonth.plusDays(1);
	// 取2018年10月第一个周三 so easy?:  2018-10-03
	LocalDate thirdMondayOf2018 = LocalDate.parse("2018-10-01").with(TemporalAdjusters.firstInMonth(DayOfWeek.WEDNESDAY));
}
  • LocalTime
public static void localTimeTest(){
	//16:25:46.448(纳秒值)
	LocalTime todayTimeWithMillisTime = LocalTime.now();
	//16:28:48 不带纳秒值
	LocalTime todayTimeWithNoMillisTime = LocalTime.now().withNano(0);
	LocalTime time1 = LocalTime.parse("23:59:59");
}
  • LocalDateTime
public static void localDateTimeTest(){
	//转化为时间戳  毫秒值
	long time1 = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
	long time2 = System.currentTimeMillis();
	
	//时间戳转化为localdatetime
	DateTimeFormatter df= DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss.SSS");
	
	System.out.println(df.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(time1),ZoneId.of("Asia/Shanghai"))));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值