jdk1.8的新特性——时间日期之LocalTime

在上一篇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

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值