JDK 8对时间日期应用的改进详解

前言

1.8之前JDK自带的日期处理类非常不方便,我们处理的时候经常是使用的第三方工具包,比如commons-lang包等。不过1.8出现之后这个改观了很多,比如日期时间的创建、比较、调整、格式化、时间间隔等。这些类都在java.time包下。比原来实用了很多。

1.1 LocalDate/LocalTime/LocalDateTime

(1)LocalDate为日期处理类、LocalTime为时间处理类、LocalDateTime为日期时间处理类,方法都类似,具体可以看API文档或源码,选取几个代表性的方法做下介绍。

now相关的方法可以获取当前日期或时间,of方法可以创建对应的日期或时间,parse方法可以解析日期或时间,get方法可以获取日期或时间信息,with方法可以设置日期或时间信息,plus或minus方法可以增减日期或时间信息;

(2)LocalDate/LocalDateTime/LocalTime与Date的互转

// 01. java.util.Date --> java.time.LocalDateTime
public void UDateToLocalDateTime() {
java.util.Date date = new java.util.Date();
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
}

// 02. java.util.Date --> java.time.LocalDate
public void UDateToLocalDate() {
java.util.Date date = new java.util.Date();
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
LocalDate localDate = localDateTime.toLocalDate();
}

// 03. java.util.Date --> java.time.LocalTime
public void UDateToLocalTime() {
java.util.Date date = new java.util.Date();
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
LocalTime localTime = localDateTime.toLocalTime();
}

// 04. java.time.LocalDateTime --> java.util.Date
public void LocalDateTimeToUdate() {
LocalDateTime localDateTime = LocalDateTime.now();
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDateTime.atZone(zone).toInstant();
java.util.Date date = Date.from(instant);
}

// 05. java.time.LocalDate --> java.util.Date
public void LocalDateToUdate() {
LocalDate localDate = LocalDate.now();
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
java.util.Date date = Date.from(instant);
}

// 06. java.time.LocalTime --> java.util.Date
public void LocalTimeToUdate() {
LocalTime localTime = LocalTime.now();
LocalDate localDate = LocalDate.now();
LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDateTime.atZone(zone).toInstant();
java.util.Date date = Date.from(instant);
}

1.2 TemporalAdjusters

(1)这个类在日期调整时非常有用,比如得到当月的第一天、最后一天,当年的第一天、最后一天,下一周或前一周的某天等。
看下接口定义,就一个方法

@FunctionalInterface
public interface TemporalAdjuster {

        Temporal adjustInto(Temporal temporal);
}

这里一些常用的操作在TemporalAdjusters类已经预定义了

TemporalAdjusters的一些预定义方法

dayOfWeekInMonth 创建一个新的日期,值为同一个月中每一周的第几天

firstDayOfMonth创建一个新的日期,它的值为当月的第一天 

firstDayOfNextMonth 创建一个新的日期,它的值为下月的第一天

firstDayOfNextYear 创建一个新的日期,它的值为明年的第一天 

firstDayOfYear创建一个新的日期,它的值为当年的第一天 

firstInMonth 创建一个新的日期,它的值为同一个月中,第一个符合星期几要求的值

lastDayOfMonth 创建一个新的日期,它的值为当月的最后一天 

lastDayOfNextMonth创建一个新的日期,它的值为下月的最后一天

 lastDayOfNextYear 创建一个新的日期,它的值为明年的最后一天
 
lastDayOfYear 创建一个新的日期,它的值为今年的最后一天 

lastInMonth创建一个新的日期,它的值为同一个月中,最后一个符合星期几要求的值 

next/previous创建一个新的日期,并将其值设定为日期调整后或者调整前,第一个符合指定星 期几要求的日期

nextOrSame/previousOrSame创建一个新的日期,并将其值设定为日期调整后或者调整前,第一个符合指定星期几要求的日期,如果该日期已经符合要求,直接返回该对象
​

(2)下面看下代码实现的例子:

	@Test
	public void testName() {
		LocalDate date = LocalDate.parse("2017-08-15");
		//获取这个月的第一个周末的时间
		System.out.println(date.with(TemporalAdjusters.dayOfWeekInMonth(1, DayOfWeek.SUNDAY)));//2017-08-06
		
		//获取上个月的最后一周
		System.out.println(date.with(TemporalAdjusters.dayOfWeekInMonth(0, DayOfWeek.SUNDAY)));//2017-07-30
		
		//获取这个月的倒数第一个周末的时间
		System.out.println(date.with(TemporalAdjusters.dayOfWeekInMonth(-1, DayOfWeek.SUNDAY)));//2017-08-27
		
		//获取这个月的第一个周末的时间,上面的dayOfWeekInMonth更灵活,可以定义第几周
		System.out.println(date.with(TemporalAdjusters.firstInMonth(DayOfWeek.SUNDAY)));//2017-08-06
		
		//其底层调用的是
//		  return TemporalAdjusters.dayOfWeekInMonth(1, dayOfWeek);
		
		//明年的第一天
		System.out.println(date.with(TemporalAdjusters.firstDayOfNextYear()));//2018-01-01
		
		//获取下周5的时间
		System.out.println(date.with(TemporalAdjusters.next(DayOfWeek.FRIDAY)));//2017-08-18
		System.out.println(date.with(TemporalAdjusters.next(DayOfWeek.TUESDAY)));//2017-08-22,始终返回下周的某个时间
		
		//获取周2时间
		System.out.println(date.with(TemporalAdjusters.nextOrSame(DayOfWeek.TUESDAY)));//2017-08-15,如果当前时间刚好是星期三,那么就返回当前时间
		
		// 获取本月最后一天
		System.out.println(date.with(TemporalAdjusters.lastDayOfMonth()));//2017-08-31
	}

1.3 DateTimeFormatter

1)以前日期格式化一般用SimpleDateFormat类,但是不怎么好用,现在1.8引入了DateTimeFormatter类,默认定义了很多常量格式(ISO打头的),在使用的时候一般配合LocalDate/LocalTime/LocalDateTime使用,比如想把当前日期格式化成yyyy-MM-dd hh:mm:ss的形式:

(2)下面用一段代码作为例子

LocalDateTime dt = LocalDateTime.now();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");       
System.out.println(dtf.format(dt));
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章