java plusdays_Java8新特性之新的日期和时间API

使用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]

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值