Java8-时间API

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方法。

本文来源于我的个人博客:http://www.jimblog.site/blog/articles/85.html

你可能感兴趣的:(java,time,Java核心基础)