文章目录
前言
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