Java8新特性——有关时间的优化

1.LocalDate  LocalTime   LocalDateTime

这三个类最突出的特点就是都是不可变的和线程安全的。

LocalDate是不可变的日期对象;LocalTime是一个不可变的时间对象;LocalDateTime是一个不可变的日期时间对象。也就是相当于LocalDateTime是LocalDate和LocalTime两者的一个综合体。三个类的操作都是相似的,这里就讲讲LocalDateTime这个类。

  • LocalDateTime now()    从默认时区的系统时钟获取当前的日期时间。
  • LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second)   从年,月,日,小时,分钟和秒获得LocalDateTime的实例
  • LocalDateTime parse(CharSequence text, DateTimeFormatter formatter)   使用特定的格式化LocalDateTime从文本字符串获取LocalDateTime实例
  • LocalDateTime plusDays(long days)  返回此LocalDateTime的副本,并以指定的时间段添加天数
  • LocalDateTime   minusDays(long days)  返回此LocalDateTime的副本,并已指定的时间段减少天数
  • LocalDateTime   with(TemporalAdjuster adjuster)  返回此日期时间的调整副本
  • OffsetDateTime  atOffset(ZoneOffset offset)   将此日期时间与偏移量相结合以创建OffsetDateTime

举例:

	//1.LocalDate  LocalTime   LocalDateTime
	@Test
	public void test() {
		LocalDateTime ldt=LocalDateTime.now();
		System.out.println(ldt);
		
		LocalDateTime ldt2=LocalDateTime.of(2015, 10, 19, 13, 22,33);
	    System.out.println(ldt2);
	    
	    System.out.println(ldt2.plusDays(1));
	    System.out.println(ldt2.minusDays(1));
	    
	    System.out.println(ldt2.getMonthValue());
	    System.out.println();
	}

输出结果:
2018-09-15T14:39:17.294
2015-10-19T13:22:33
2015-10-20T13:22:33
2015-10-18T13:22:33
10

2.Instant  时间戳

  • Instant now()  从系统时钟获取当前瞬间
  • OffsetDateTime atOffset(ZoneOffset offset)  将此瞬间与偏移组合起来创建以恶搞OffsetDateTime
  • Instant ofEpochSecond(long epochSecond)   使用从1970-01-01T00:00:00的时期开始的秒数获得Instant的实例
  • Instant parse(CharSequence text)   从一个文本字符串(如,2007-12-03T10:15:30.00Z)获取一个Instant的实例
  • long getEpochSecond()   从1970-01-01T00:00:00Z到现在的秒数
  • long toEpochMilli()   将此瞬间转换为1970-01-01T00:00:00Z的时期的毫秒数

举例:

	//2.Instant :时间戳(以Unix 元年:1970年1月1日00:00:00到某个时间之间的毫秒值)
	@Test
	public void test2() {
		Instant ins1=Instant.now();  //默认获取UTC时区
		System.out.println(ins1);
		System.out.println(ins1.getEpochSecond());
		
		OffsetDateTime t=ins1.atOffset(ZoneOffset.ofHours(8));  //偏移8小时
		System.out.println(t);
		
		System.out.println(ins1.toEpochMilli());   //获取毫秒值
		Instant inst2=Instant.ofEpochSecond(60);
		System.out.println(inst2);
	}

输出结果:
2018-09-15T06:56:35.995Z
1536994595
2018-09-15T14:56:35.995+08:00
1536994595995
1970-01-01T00:01:00Z

3.Duration :计算两个时间之间的间隔

当我们需要计算两个时间之间的毫秒数时,往往可以借助Duration这个类来实现。

  • Duration between(Temporal startInclusive,Temporal endExclusive)   获取一个Duration表示两个时间对象的持续时间
  • long toMillis()   将此持续时间转换为总长度(以毫秒为单位)

举例:

	@Test
	public void test3() {
		Instant ins1=Instant.now();
		try {
			Thread.sleep(1000);
		}catch(InterruptedException e) {
			
		}
		Instant ins2=Instant.now();
		Duration duration=Duration.between(ins1, ins2);
		System.out.println(duration.toMillis());
		
		
		LocalTime lt1=LocalTime.now();
		try {
			Thread.sleep(1000);
		}catch(InterruptedException e) {
		}
		LocalTime lt2=LocalTime.now();
		System.out.println(Duration.between(lt1, lt2).toMillis());
	}

输出结果:

1000
1000

4.Period:计算两个日期之间的间隔

Period和Duration作用类似,但是Period主要是针对两个日期之间的间隔,它主要实现的是获取间隔有关的日期信息,比如年月日。

  • Period   between(LocalDate  startDateInclusive ,LocalDate endDateExclusive)   获得一个Period,由两个日期之间的年数,月份和日期组成
  • int getYears()   获得这段时间的年数
  • int getMonths()   获去此期间的月数
  • int getDays()  获得此期间的天数

Period的between方法和Duration的between是不同的,Period的between方法的参数类型必须是LocalDate类型。

举例:
 

	@Test
	public  void test4() {
		LocalDate ld1=LocalDate.of(2015, 1, 1);
		LocalDate ld2=LocalDate.now();
		Period period = Period.between(ld1, ld2);
		System.out.println(period.getYears());
		System.out.println(period.getMonths());
		System.out.println(period.getDays());
	}

输出结果:

3
8
14

5.TemporalAdjuster:时间校正器

  • TemporalAdjuster next(DayOfWeek  dayOfWeek)  返回下一个星期的调整器,该调整器将日期调整为在调整日期之后的指定日期的的第一次出现

举例:

	//TemporalAdjuster:时间校正器
	@Test
	public void test6() {
		LocalDateTime ldt=LocalDateTime.of(2018, 9, 8,20,44,0);
		System.out.println(ldt);
		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( (e) -> {
			LocalDateTime l=(LocalDateTime)e;
			DayOfWeek dow=l.getDayOfWeek();
			if(dow.equals(DayOfWeek.FRIDAY)) {
				return l.plusDays(3);
			}else if(dow.equals(DayOfWeek.SATURDAY)) {
				return l.plusDays(2);
			}else {
				return l.plusDays(1);
			}
		});
		System.out.println(ldt5);
	}

输出结果:
2018-09-08T20:44
2018-09-10T20:44
2018-09-09T20:44
2018-09-10T20:44

6.DateTimeFormatter:格式化时间/日期

  •  DateTimeFormatter ofPattern(String pattern)   使用指定的模式创建格式化程序

举例:

	//DateTimeFormatter:格式化时间/日期
	@Test
	public void test7() {
		DateTimeFormatter dtf=DateTimeFormatter.ISO_DATE;
		LocalDateTime ldt=LocalDateTime.now();
		String strDate=ldt.format(dtf);
		System.out.println(strDate);
		
		
		DateTimeFormatter dtf2=DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
		System.out.println(dtf2.format(ldt));
		
		String strDate2=dtf2.format(ldt);
		LocalDateTime newDate=ldt.parse(strDate2,dtf2);
		System.out.println(newDate);
		
	}

输出结果:

2018-09-15
2018年09月15日 15:26:18
2018-09-15T15:26:18

7.常见使用

  • 获取当前系统时间的时间戳

long ms = Instant.now().toEpochMilli();

  • 获得当前系统时间的年月日

int year = LocalDateTime.now().getYear();

int month = LocalDateTime.now().getMonthValue();

int day =  LocalDateTime.now().getDayOfMonth();

猜你喜欢

转载自blog.csdn.net/ljcgit/article/details/82356666