在上一篇jdk1.8的新特性——时间日期之LocalDate中,我们学习了LocalDate的基本的常用用法,学会了如何获取一个本地日期对象,如何获取年月日,如何比较日期的是否相等以及日期前后顺序,如何在LocalDate对象的基础获取指定日期单位和数量的副本等等。今天,我们一起来学习LocalTime这个API,其中的学习目标和LocalDate相似。
首先如何获取一个LocalTime对象?
public static void main(String[] args) {
//获取当前时间(带有毫秒):09:40:44.721
LocalTime timeMills = LocalTime.now();
//在 timeMills 基础上获取不带毫秒的 time: 09:40:44
//nanoSecond 纳秒,十亿分之一秒
LocalTime time = timeMills.withNano(0);
//午餐时刻的LocalTime对象lunchtime:12:00 (注意:second为00,会省略second)
LocalTime lunchtime = LocalTime.of(12, 00, 00);
//午休时刻的LocalTime对象lunchBreak:12:30
LocalTime lunchBreak = LocalTime.parse("12:30:00");
//下午茶时刻的LocalTime对象:15:30:30
LocalTime teaTime = LocalTime.ofSecondOfDay(15 * 3600 + 30 * 60 + 30);
//加班时刻的LocalTime对象:00:00
LocalTime overtime = LocalTime.MIDNIGHT;
//下班时间的LocalTime对象:18:00
LocalTime closingTime = LocalTime.from(LocalTime.of(18,00));
}
LocalTime.now()获取当前时间,可以看出获取后的对象timeMills是显示毫秒数,这里我们可以使用withNano(0)去除毫秒数。这里有同学可能会问,nano是nanosecond(纳秒)的缩写,为什么可以修改毫秒数?这是因为LocalTime的toString方法对显示值做了处理。有兴趣的同学可以看看源码,这里我就不展开了。LocalTime.of(12, 00, 00)与LocalTime.prase("12:00:00")就不多说了,和LocalDate的同名方法理解相同。
LocalTime.ofSecondOfDay(15 * 3600 + 30 * 60 + 30)是根据一天中的第几秒创建LocalTime对象,还有个相似的方法ofNanoOfDay(long nanoOfDay),ofNanoOfDay是根据一天中的第几纳秒创建LocalTime对象(这辈子都用不到吧)。然后是LocalTime.MIDNIGHT,可以看出这是一个常量,这样的常量一共有四个,MIN、MAX、 NOON、 MIDNIGHT。MIN和MIDNIGHT都是00:00,意味一天的开始;NOON是中午12:00,意味着半天;MAX是23:59:59.999999999,意味着一天的结束。LocalTime.from(TemporalAccessor temporal)暂时不讲,在下一篇LocalDateTime中讲这个方法的理解。其实LocalDate里面也有常量的LocalDate对象和ofYearDay方法、from方法,我们学习的过程是由易到难,由常用到全面,所以在上一篇中我们没有写出这些。希望同学们可以再回过头去试试LocalDate的那些方法。
我们现在简单地看一下,上一篇LocalDate中出现的方法,在LocalTime中的使用。
//获取time的小时数:9
int hour = time.getHour();
//获取time的分钟数:40
int minute = time.getMinute();
//获取time的秒数:44
int second = time.getSecond();
//判断下午茶是不是在午休之后:true
boolean flag = teaTime.isAfter(lunchBreak);
//判断下午茶是不是在下班之前:true
boolean flag1 = teaTime.isBefore(closingTime);
//下午茶与午休比较大小:1
int comparativeResult = teaTime.compareTo(lunchBreak);
//下午茶与下班时间比较大小:-1
int comparativeResult1 = teaTime.compareTo(closingTime);
//time的1小时5分钟后的LocalTime对象:10:45:44
LocalTime nextHour = time.plusHours(1).withMinute(5);
//项目发布日的LocalDate对象:2019-08-31
LocalDate releaseDate = LocalDate.of(2019, 8, 31);
//项目发布日加班的日期时间 LocalDateTime对象:2019-08-31T00:00 (T的由来:toString方法加了T作为间隔)
LocalDateTime overtimeForRelease = overtime.atDate(releaseDate);
这里我们注意下最后的time.atDate(LocalDate date),这个方法是在LocalTime的time对象上加上LocalDate的releaseDate对象构成LocalDateTime对象。相应地,在LocalDate中也有atTime方法也是返回一个LocalDateTime对象。接下来,让我看看开发过程中必不可少的一个方法,转换时间显示格式。
//定义日期时间中文表达格式:**时**分**秒
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH时mm分ss秒");
//根据timeFormatter获取time的中文表达式:09时40分55秒
String timeString = time.format(timeFormatter);
//根据timeFormatter获取lunchtime的中文表达式:12时00分00秒 (注意:second为00时,不会省略second)
String lunchtimeString = lunchtime.format(timeFormatter);
DateTimeFormatter的类注释上有句:This class is immutable and thread-safe.这个类是线程安全的不可变类。所以忘记jdk1.8以前的SimpleDateFormatter等等吧。
留个问题:在LocalTime的toString方法中可以看到源码里有这样一句buf.append(Integer.toString((nanoValue / 1000_000) + 1000).substring(1)); 为什么不直接写成buf.append(Integer.toString((nanoValue / 1000_000)); 同学们动动脑筋,欢迎大家留言~~
下一篇:jdk1.8的新特性——时间日期之LocalDateTime