Jim Blog I've been trying so hard,but doesn't even matter
博客信息

Java8-时间API

发布时间:『 2018-04-02 14:08 』  博客类别:Java核心基础  阅读(123) 评论(0)

Java 1.0就有了Date类,从源码上那一堆过时标记的方法就可以看出这个类设计的缺陷了,然后有了Calendar类,虽差强人意,但还是不甚完美,所以Java8引入了java.time,改正了很多以前的问题。

我们都知道,DateCalendar不是线程安全的,Date里的很多方法都太反人类了(现在应该没人用了吧。。),Calendar的很多方法也还能用,但为了保证程序以后的正确使用,还是拥抱Java8的时间API较为稳妥。


LocalDate:

LocalDate代表一个IOS格式(yyyy-MM-dd)的日期,要构造一个LocalDate对象,你可以这样:

LocalDate today=LocalDate.now();
LocalDate someday2 = LocalDate.parse("year-month-dayOfMonth");
LocalDate someday=LocalDate.of(year, month, dayOfMonth);//月数可以直接用数字,也可以用Month枚举

LocalDate有很多方法可以对日期进行操作。

比如增加几天,几周,几月或几年:

plusDays(daysToAdd);
plusWeeks(weeksToAdd);
......

减少几天,几周.......:

minusDays(daysToSubtract);
minusWeeks(weeksToSubtract);
.......

得到周//年中第几天:

getDayOfWeek/Month/Year();    //获取星期几返回的是DayOfWeek的枚举,另两个是int

判断是否是闰年:

isLeapYear();

将当前LocalDate和另外一个进行比较:

isBefore();  isAfter();     //当前日期是否在比较日期之前/之后


LocalTime:

LocalTime表示的是当前时间,可精确到纳秒,同样,你也有几种方法构造这个对象:

LocalTime.now();
LocalTime.of(hour, minute, second);  //可以有第四个参数,纳秒级
LocalTime.parse("hour:minute:second.Nano");

LocalTime也有很多方法对时间进行操作,跟LocalDate很像,详细请参考API文档

此外,还有一个LocalDateTime类表示日期和时间,也不赘述。

 

ZonedDateTime:

如果你需要处理不同时区的时间,应对不同时区的用户,这个类将解决你的问题。创建这个对象如下:

ZonedDateTime.now();
ZonedDateTime.of(year, month, dayOfMonth, hour, minute, second, nanoOfSecond, zone);  
//最后一个参数是设置时区,可以用ZoneId.of(“zone name”)得到,具体名称可参照文档

ZonedDateTime的很多方法与前面的差不多,详细可参照文档。

需要注意的是,当要计算夏令时的时间时,要用Period对象表示的时间量,而不应该用Duration表示的时间量, Duration不能处理夏令时

 

Instant:

这个类的Instant.now()会返回当前瞬间的时间点,可以用Instant类对象作为时间戳,比较两个瞬时时间。要计算两个瞬时时间的时间差,可以用Duration.between方法。

 

应对遗留代码:

以前旧的时间API增加了转换方法toxxx,而从当前的API转换到遗留类则添加了from方法,下面举个例子:

Date date=new Date();
Instant instant = date.toInstant(); 
Date from = Date.from(Instant.now());


新的时间API比之前的更加方便好用,稍加学习即可上手,关于时间日期的处理,强烈推荐使用新的API方法。

关键字:   Java     时间日期  
博主信息
Jim
(生命,是一场徒劳的坚持)