概述
使用LocalDate、LocalTime、LocalDateTime
LocalDate、LocalTime、LocalDateTime 类的实例是不可变的对象,分别表示使用ISO-8601日历系统的日期、时间、日期和时间。它们提供了简单的日期或时间,并不包含当前的时间信息。也不包含与时区相关的信息。
注:ISO-8601日历系统是国际标准化组织制定的现代公民的日期和时间的表示法
//1.LocalDate、LocalTime、LocalDateTime
@Test
public void test1(){
//获取当前时间
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);//2017-03-13T15:52:41.810
//指定日期实例
LocalDateTime ldt2 = LocalDateTime.of(2016, 5, 22, 14, 20, 22);
System.out.println(ldt2);//2016-05-22T14:20:22
//加一年
LocalDateTime ldt3 = ldt.plusYears(1L);
System.out.println(ldt3);//2018-03-13T15:53:51.812
//分别去年月日时分秒
System.out.println(ldt.getYear());//2017
System.out.println(ldt.getMonthValue());//3
System.out.println(ldt.getDayOfMonth());//13
System.out.println(ldt.getHour());//15
System.out.println(ldt.getMinute());//56
System.out.println(ldt.getSecond());//22
}
Instant 时间戳
用于“时间戳”的运算。它是以Unix元年(传统的设定为UTC时区1970年1月1日午夜时分)开始所经历的描述进行运算
//2.Instant 时间戳
@Test
public void test2(){
Instant in = Instant.now();//默认获取UTC时区时间(格林威治时间),与中国时间差8小时
System.out.println(in);//2017-03-13T08:04:57.942Z
OffsetDateTime offsetDateTime = in.atOffset(ZoneOffset.ofHours(8));
System.out.println(offsetDateTime);//2017-03-13T16:04:57.942+08:00
//获取时间戳
System.out.println(in.toEpochMilli());//1489392373689
//对UTC元年的计算
Instant newIn = Instant.ofEpochSecond(60);
System.out.println(newIn);//1970-01-01T00:01:00Z
}
Duration 和Period
Duration:用于计算两个“时间”间隔
Period:用于计算两个“日期”间隔 //3.Duration 和Period
/*Duration:用于计算两个“时间”间隔
Period:用于计算两个“日期”间隔*/
@Test
public void test3() throws InterruptedException {
//Duration:用于计算两个“时间”间隔
Instant in1 = Instant.now();
Thread.sleep(1000);
Instant in2 = Instant.now();
Duration d = Duration.between(in1, in2);
System.out.println(d.toMillis());//1000
System.out.println("-------------");
LocalDateTime ldt1 = LocalDateTime.now();
Thread.sleep(2000);
LocalDateTime ldt2 = LocalDateTime.now();
Duration d2 = Duration.between(ldt1, ldt2);
System.out.println(d2.toMillis());//2000
//Period:用于计算两个“日期”间隔
LocalDate ld = LocalDate.of(2015, 12, 20);
LocalDate ld2 = LocalDate.now();
Period p1 = Period.between(ld, ld2);
System.out.println(p1.getYears());//1
System.out.println(p1.getMonths());//2
System.out.println(p1.getDays());//21
}
日期的操纵
TemporalAdjuster : 时间校正器。有时我们可能需要获取例如:将日期调整到“下个周日”等操作。
TemporalAdjusters : 该类通过静态方法提供了大量的常用TemporalAdjuster 的实现 //4.TemporalAdjuster : 时间校正器
@Test
public void test4(){
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);//2017-03-13T16:36:56.641
LocalDateTime ldt1 = ldt.withDayOfMonth(10);
System.out.println(ldt1);//2017-03-10T16:36:56.641
LocalDateTime ldt2 = ldt.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
System.out.println(ldt2);//2017-03-19T16:36:56.641
//自定义下一个周日
LocalDateTime ldt4 = ldt.with((l) ->{
LocalDateTime ldt3 = (LocalDateTime) l;
DayOfWeek dow = ldt3.getDayOfWeek();
if (dow.equals(DayOfWeek.SUNDAY)){
return ldt3.plusDays(7L);
}else if (dow.equals(DayOfWeek.MONDAY)){
return ldt3.plusDays(6L);
} else if (dow.equals(DayOfWeek.THURSDAY)){
return ldt3.plusDays(5L);
}else if (dow.equals(DayOfWeek.WEDNESDAY)){
return ldt3.plusDays(4L);
} else if (dow.equals(DayOfWeek.FRIDAY)){
return ldt3.plusDays(3L);
}else if(dow.equals(DayOfWeek.SATURDAY)){
return ldt3.plusDays(2L);
}else{
return ldt3.plusDays(1L);
}
});
System.out.println(ldt4);//2017-03-19T16:51:55.069
}
解析与格式化
java.time.format.DateTimeFormatter 类:该类提供了三种格式化方法:
预定义的标准格式
语言环境相关的格式
自定义的格式
//5.DateTimeFormatter:解析与格式化
@Test
public void test5(){
DateTimeFormatter dtf = DateTimeFormatter.ISO_DATE;
LocalDateTime ldt = LocalDateTime.now();
String str = ldt.format(dtf);
System.out.println(str);//2017-03-13
System.out.println("-----------------------");
//自定义自己的格式
DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy年MM月dd日HH时mm分ss秒");
String str1 = dtf1.format(ldt);
System.out.println(str1);//2017年03月13日17时13分26秒
LocalDateTime ldt2 = LocalDateTime.parse(str1, dtf1);
System.out.println(ldt2);//2017-03-13T17:13:26
}
时区的处理
Java8 中加入了对时区的支持,带时区的时间为分别为:ZonedDate、ZonedTime、ZonedDateTime
其中每个时区都对应着ID,地区ID都为“{区域}/{城市}”的格式例如:Asia/Shanghai 等
ZoneId:该类中包含了所有的时区信息
getAvailableZoneIds() : 可以获取所有时区时区信息
of(id) : 用指定的时区信息获取ZoneId 对象
//6.ZonedDate、ZonedTime、ZonedDateTime
@Test
public void test6(){
//获取支持的所有时区
Set set = ZoneId.getAvailableZoneIds();
set.forEach(System.out::println);
/*Asia/Aden
America/Cuiaba
Etc/GMT+9
Etc/GMT+8
Africa/Nairobi
America/Marigot
Asia/Aqtau
Pacific/Kwajalein
America/El_Salvador
Asia/Pontianak
Africa/Cairo
......
*/
LocalDateTime ldt = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
System.out.println(ldt);//2017-03-13T17:22:15.483
LocalDateTime ldt1 = LocalDateTime.now(ZoneId.of("Africa/Monrovia"));
ZonedDateTime zdt = ldt1.atZone(ZoneId.of("Asia/Shanghai"));
System.out.println(zdt);//2017-03-13T09:24:15.446+08:00[Asia/Shanghai]
}
最后
以上就是大气小松鼠为你收集整理的java plusdays_Java8新特性之新的日期和时间API的全部内容,希望文章能够帮你解决java plusdays_Java8新特性之新的日期和时间API所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复