Java 1.0就有了Date类,从源码上那一堆过时标记的方法就可以看出这个类设计的缺陷了,然后有了Calendar类,虽差强人意,但还是不甚完美,所以Java8引入了java.time,改正了很多以前的问题。
我们都知道,Date和Calendar不是线程安全的,Date里的很多方法都太反人类了(现在应该没人用了吧。。),Calendar的很多方法也还能用,但为了保证程序以后的正确使用,还是拥抱Java8的时间API较为稳妥。
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();
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方法。
应对遗留代码:
Date date=new Date();
Instant instant = date.toInstant();
Date from = Date.from(Instant.now());
本文来源于我的个人博客:http://www.jimblog.site/blog/articles/85.html