java8 LocalTime的使用方法

文章目录

前言

Java 8里面添加了许多的新特性,如LocalDate、LocalTime、LocalDateTime。

新增的日期类主要有三种:

java.time.LocalDate ->只对年月日做出处理

默认格式:yyyy-MM-dd, 例如:2021-11-29

java.time.LocalTime ->只对时分秒纳秒做出处理

默认格式:HH:mm:ss.SSSSSSSSS 例如:11:23:40.051942200。
当纳秒<=0时,不显示纳秒
当秒<=0且纳秒<=0时,默认只显示时:分 如11:23

java.time.LocalDateTime ->同时可以处理年月日和时分秒

默认格式:yyyy-MM-ddTHH:mm:ss.SSSSSSSSS 例如:2021-12-01T11:27:22.598224900

一:创建LocalTime

方法说明
static LocalTime now()返回当前时间时分秒纳秒,默认格式:HH:mm:ss.SSSSSSSSS
static LocalTime now(ZoneId zone)通过指定时区创建LocalTime实例
static LocalTime now(Clock clock)通过指定时钟创建LocalTime实例
static LocalTime of(int hour, int minute)通过时、分创建LocalTime实例, 输出格式为HH:mm,此时默认不输出秒、纳秒
static LocalTime of(int hour, int minute, int second)通过时、分、秒创建LocalTime实例,默认输出格式为HH:mm:ss
static LocalTime of(int hour, int minute, int second, int nanoOfSecond)通过时、分、秒、纳秒创建LocalTime实例,当纳秒>0时显示纳秒,否则不显示纳秒
static LocalTime ofSecondOfDay(long secondOfDay)通过一天的秒数创建LocalTime实例 secondOfDay:从0到24 * 60 * 60 – 1
static LocalTime ofNanoOfDay(long nanoOfDay)通过一天的纳秒数创建LocalTime实例 nanoOfDay:从0到24 * 60 * 60 * 1,000,000,000 - 1
//获取当前时分秒纳秒
System.out.println(LocalTime.now()); //15:51:01.167526700
//获取指定闹钟的时间
System.out.println(LocalTime.now(Clock.systemUTC()));//07:51:01.168523900 备注:utc时间与当前时间相差8小时
//获取指定时区的时间
System.out.println(LocalTime.now(ZoneId.systemDefault())); //15:51:01.168523900
//获取时、分
System.out.println(LocalTime.of(13, 23));//13:23
//获取时、分、秒
System.out.println(LocalTime.of(13, 23,23));//13:23:23
//获取时、分、秒(当秒=0时,默认不显示秒,只有HH:mm)
System.out.println(LocalTime.of(13, 23,0));//13:23
//获取时、分、秒、纳秒
System.out.println(LocalTime.of(13, 23,33,1));//13:23:33.000000001
//获取时、分、秒、纳秒(当纳秒=0时,默认不显示纳秒)
System.out.println(LocalTime.of(13, 23,0,0));//13:23
//通过一天内的秒创建LocalTime
System.out.println(LocalTime.ofSecondOfDay(24*60));//00:24
//通过一天内的纳秒创建LocalTime
System.out.println(LocalTime.ofNanoOfDay(24*60));//00:00:00.000001440

二:LocalTime时间比较

方法说明
boolean isAfter(LocalTime other)比较时间是否在other之后
boolean isBefore(LocalTime other)比较时间是否在other之前
int compareTo(LocalTime other)时间比较localTimeA.compareTo(localTimeB),若相等返回0;若A大于B,返回1 ;若A小于B返回-1

说明:isAfter、isBefore只能比较之前之后,当值相等的时候,需要用compareTo比较

LocalTime before = LocalTime.parse("10:51:01.167526700");
LocalTime after = LocalTime.parse("15:51:01.167526700");
//获取当前时分秒纳秒
System.out.println(before.isAfter(after)); //false
System.out.println(before.isBefore(after)); //true

System.out.println(before.compareTo(after)); //-1
System.out.println(after.compareTo(before)); //1
System.out.println(before.compareTo(before)); //0

三:获取时、分、秒、纳秒

方法说明
int getHour()获取小时 ,返回0到23
int getMinute()获取分钟,返回0到59
int getSecond()获取秒,返回0到59
int getNano()获取纳秒,返回0到999,999,999
int get(TemporalField field)通用方法,通过传入TemporalField对象可以获取时、分、秒、毫秒、纳秒 …
long getLong(TemporalField field)通用方法,通过传入TemporalField对象可以获取时、分、秒、毫秒、纳秒…
LocalTime now = LocalTime.parse("15:51:01.167526700");

//获取小时
System.out.println(now.getHour()); //15
//获取分钟
System.out.println(now.getMinute()); //51
//获取秒
System.out.println(now.getSecond()); //1
//获取纳秒
System.out.println(now.getNano()); //167526700

//通用获取,通过传入TemporalField对象,获取时、分、秒、纳秒等值
System.out.println(now.get(ChronoField.HOUR_OF_DAY)); //15

四:时间计算,加/减时、分、秒、纳秒…

4.1、加/减时、分、秒、纳秒
方法说明
LocalTime plus(long amountToAdd, TemporalUnit unit)通用方法,可以通过unit参数控制增加纳秒、微秒、毫秒、秒、分、时
LocalTime plusHours(long hoursToAdd)返回增加了*小时的LocalTime副本
LocalTime plusMinutes(long minutesToAdd)返回增加了*分钟的LocalTime副本
LocalTime plusSeconds(long secondstoAdd)返回增加了*秒的LocalTime副本
LocalTime plusNanos(long nanosToAdd)返回增加了*纳秒的LocalTime副本
LocalTime minus(long amountToSubtract, TemporalUnit unit)通用方法,可以通过unit参数控制减少纳秒、微秒、毫秒、秒、分、时
LocalTime minusHours(long hoursToSubtract)返回减少了*小时的LocalTime副本
LocalTime minusMinutes(long minutesToSubtract)返回减少了*分钟的LocalTime副本
LocalTime minusSeconds(long secondsToSubtract)返回减少了*秒的LocalTime副本
LocalTime minusNanos(long nanosToSubtract)返回减少了*纳秒的LocalTime副本
LocalTime now = LocalTime.parse("10:51:01.167526700");
//LocalTime plus(long amountToAdd, TemporalUnit unit)  
//当前api中unit可以用的有NANOS、MICROS、MILLIS、SECONDS、MINUTES、HOURS、HALF_DAYS。其他单元不可用
System.out.println("增加1小时:"+now.plus(1, ChronoUnit.HOURS)); //11:51:01.167526700

System.out.println("增加1小时:"+now.plusHours(1));//11:51:01.167526700
System.out.println("增加1分钟:"+now.plusMinutes(1));//10:52:01.167526700
System.out.println("增加1秒:"+now.plusSeconds(1));//10:51:02.167526700
System.out.println("增加1纳秒:"+now.plusNanos(1));//10:51:01.167526701
4.2、计算两个时间的间隔

方法一:

通过Duration计算两个LocalTime相差的时间

LocalTime start = LocalTime.parse("10:51:01.167526700");
LocalTime end = LocalTime.parse("15:52:03.167526701");

//between的用法是end-start的时间,若start的时间大于end的时间,则所有的值是负的
Duration duration = Duration.between(start, end);
System.out.println("两个时间相差:"+duration.toSeconds()+"秒,相差:"+duration.toHours()+"小时,相差:"+duration.toMinutes()+"分钟");

结果:
两个时间相差:18062秒,相差:5小时,相差:301分钟

方法二:

ChronoUnit也可以计算两个单元之间的差值。
我们使用ChronoUnit类的between() 方法来执行相同的操作

LocalTime start = LocalTime.parse("10:51:01.167526700");
LocalTime end = LocalTime.parse("15:52:03.167526701");

long seconds = ChronoUnit.SECONDS.between(start , end );
long hour = ChronoUnit.HOURS.between(start , end );
long minute = ChronoUnit.MINUTES.between(start , end );

System.out.println("两个时间相差:"+seconds+"秒,相差:"+hour+"小时,相差:"+minute+"分钟");

结果:
两个时间相差:18062秒,相差:5小时,相差:301分钟

方法三:

通过LocalTime类的toSecondOfDay()方法,返回时间对应的秒数,然后计算出两个时间相差的间隔

LocalTime start = LocalTime.parse("10:51:01.167526700");
LocalTime end = LocalTime.parse("15:52:03.167526701");

int time = end.toSecondOfDay() - start.toSecondOfDay();
System.out.println("两个时间相差:"+time+"秒");

结果:
两个时间相差:18062秒

五:时间格式化

方法说明
static LocalTime parse(CharSequence text)从文本字符串获取LocalTime实例,text格式一般是10:15或者10:15:30
static LocalTime parse(CharSequence text, DateTimeFormatter formatter)使用特定格式化形式从文本字符串获取LocalTime实例,text的格式一般与formatter格式一致,如text为HH:mm格式,则formatter也应该为HH:mm格式,否则可能会报错
String format(DateTimeFormatter formatter)将LocalTime转为特定格式的字符串
LocalTime time = LocalTime.parse("10:51:01.167526700");
System.out.println(time); //10:51:01.167526700

time = LocalTime.parse("10:51");
System.out.println(time);//10:51

time = LocalTime.parse("10:51:01");
System.out.println(time);//10:51:01

//若使用parse(CharSequence text, DateTimeFormatter formatter),text格式需与formatter格式一致,否则可能会报错
time = LocalTime.parse("10:51:01",DateTimeFormatter.ofPattern("HH:mm:ss"));
System.out.println(time);//10:51:01

String time1 = time.format(DateTimeFormatter.ofPattern("HH-mm-ss"));
System.out.println(time1); //10-51-01

六:LocalTime进阶

6.1 修改LocalTime的时、分、秒、纳秒
方法说明
LocalTime with(TemporalAdjuster adjuster)使用传递的TemporalAdjuster时间调节器作为参数来调整此日期时间,并在调整后返回调整后的时间的副本
LocalTime with(TemporalField field, long newValue)用于将LocalTime的指定字段设置为新值并返回新的时间的副本。此方法可用于更改任何受支持的字段,例如时、分、秒…。如果由于不支持该字段或其他原因而无法设置新值,则会引发异常。
LocalTime withHour(int hour)修改LocalTime变量的小时,hour:从0到23
LocalTime withMinute(int minute)修改LocalTime变量的分钟,minute:从0到59
LocalTime withSecond(int second)修改LocalTime变量的秒,second:从0到59
LocalTime withNano(int nanoOfSecond)修改LocalTime变量的纳秒,nanoOfSecond:从0到999,999,999

使用示例:

LocalTime time = LocalTime.parse("10:51:03.167526700");
//修改LocalTime变量的小时
System.out.println(time.withHour(1)); //01:51:03.167526700
//修改LocalTime变量的分钟
System.out.println(time.withMinute(1)); //10:01:03.167526700
//修改LocalTime变量的秒
System.out.println(time.withSecond(1)); //10:51:01.167526700
//修改LocalTime变量的纳秒
System.out.println(time.withNano(1)); //10:51:03.000000001

//修改LocalTime变量的秒
System.out.println(time.with(ChronoField.SECOND_OF_MINUTE, 1)); //10:51:01.167526700

七、LocalTime的注意事项

java.time.LocalTime ->只对时分秒纳秒做出处理

默认格式:HH:mm:ss.SSSSSSSSS 例如:11:23:40.051942200。
当纳秒<=0时,不显示纳秒
当秒<=0且纳秒<=0时,默认只显示时:分 如11:23

7.1 LocalTime有时候不显示秒?

LocalTime有时候会不显示秒,有时候我们需要把时间转化为HH:mm:ss格式时,这可能就是个坑,那么如果让LocalTime输出指定的格式呢?

解决方法

LocalTime t1 = LocalTime.parse("10:00:00");
//不显示秒示例
System.out.println(t1);//10:00

//方式一
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm:ss");
System.out.println(dtf.format(t1)); //10:00:00

//方式二:
LocalTime t2= LocalTime.parse("10:00:00", dtf);
System.out.println(t2.format(DateTimeFormatter.ISO_LOCAL_TIME));//10:00:00
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值