一、使用LocalDate、LocalTime、LocalDateTime
LocalDate、LocalTime、LocalDateTime类的实例时不可变的对象,分别表示使用ISO-8601日历系统的日期、时间、日期和时间,他们提供了简单的日期或时间,并不包含当前时间信息,也不包含与时区相关的信息
public class TestLambda{
public void test(){
LocalDate ldt = LocalDateTime.now();
System.out.println(ldt);
LocalDateTime ldt1 = LocalDateTime.of(2015,10,19,13,22,33);
System.out.println(ldt1);
//增加和减少2年后产生一个新的的对象,因为是不可变对象,会生成一个新的对象
LocalDateTime ldt2 = ldt.plusYears(2);
System.out.println(ldt2);
LocalDateTime ldt3 = ldt.minusYears(2);
System.out.println(ldt3);
System.out.println(ldt.getYear());
System.out.println(ldt.getMonthValue());
}
/**
* Instant 时间戳(以Unix元年,1970年1月1日 00:00:00到某个时间的毫秒值)
**/
@Test
public void test1(){
Instant ins1 = Instant.now();//默认是UTC时区
System.out.println(ins1);
OffsetDateTime odt = ins1.atOffset(ZoneOffset.ofHours(8))//相差时区
System.out.println(odt);
//转换成毫秒值
System.out.println(ins1,toEpochMilli());
//在Unix元年 加1毫秒
Instant ins2 = Instant.ofEpochMilli(1);
System.out.println(ins2);
}
/**
* Duration 计算两个“时间”之间的间隔
* Period 计算两个“日期”之间的间隔
**/
@Test
public void test2(){
Instant ins1 = Instant.now();
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
Instant ins2 = Instant.now();
Duration duration = Duration.between(ins1,ins2);
System.out.println(duration);
System.out.println(duration.toMillis());
System.out.println("-----------------------------")
LocalDate ld1 = LocalDate.of(2020,10,28);
LocalDate ld2 = LocalDate.now();
Period p1 = Period.between(ld1,ld2);
System.out.println(p1.getYears());
System.out.println(p1.getMonths());
System.out.println(p1.getDays());
}
}
二、时间矫正器
public class TestLambda{
/**
* 日期的操作
* TemporalAdjuster 时间矫正器,有时我们需要获取
* 例如:
* 将日期调整到“下周日”等操作
*
* TemporalAjdusters 该类通过静态方法提供了大量的常用TemporalAdjuster的实现
* LocalDate nextSunday = LocalDate.now().with(TemporalAdjusters.next(DayWeek.SUNDAY))
**/
@Test
public void test(){
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);
//改变月中的天
LocalDateTime ldt2 = ldt.withDayOfMonth(10);
System.out.println(ldt2);
//下个周日
LocalDateTime ldt3 = ldt.with(TemporalAdjusters.next(DayWeek.SUNDAY));
System.out.println(ldt3);
//自定义 :下一个工作日
LocalDateTime ld5 = ldt.with((l)->{
LocalDate ldt4 = (LocalDate) l;
DayWeek dow = ldt4.getDayOfWeek();
if(dow.equals(DayWeek.FRIDAY)){
return ldt4.plusDays(3);
}else if(dow.equals(DayOfWeek.SATURDAY)){
return ldt4.plusDays(2);
}else{
return ldt4.plusDays(1);
}
});
System.out.println(ldt5);
}
}
三、DateTimeFormatter 格式化时间/日期
public class TestLambda{
@Test
public void test(){
DateTimeFormatter dtf = DateTimeFormatter.ISO_DATE;
LocalDate ldt = LocalDateTime.now();
String strDate = ldt.format(dtf);
System.out.println(strDate);
System.out.println("----------------------------");
DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
String strDate2 = dtf2.format(ldt);
System.out.println(strDate);
//将字符串解析成日期类型
LocalDateTime newDate = ldt.parse(strDate2,dtf2);
System.out.println(newDate);
}
/**
* 时区处理
* Java8 中加入对时区的支持,带时区的时间分别为
* ZoneDate \ ZoneTime \ZoneDateTime
* 其中每个时区都对应着ID,地区ID都为{区域}/{城市} 的格式
* 例如:Asia/Shanghai 等
* ZoneId 该类中包含了所有的时区信息
* getAvailableZoneIds() 可以获取所有时区信息
* of(id) 用指定的时区信息获取ZoneId对象
**/
@Test
public void test1(){
Set<Strring> set = ZoneId.getAvailableZoneIds();
set.forEach(System.out::println);
//构建指定时区 构建时间
LocalDateTime ldt = LocalDateTime.now(ZoneId.of("Africa/Cairo"));
System.out.println(ldt);
}
}