这么详细的Java8日期时间API,还不赶紧收藏起来(二):LocalTime和LocalDateTime

LocalTime

声明

public final class LocalTime
        implements Temporal, TemporalAdjuster, Comparable<LocalTime>, Serializable 

LocalTime是一个不可变的时间对象,代表一个时间,通常被看作是小时 - 秒。 时间表示为纳秒精度。 例如,值“13:45.30.123456789”可以存储在LocalTime 。它不存储或表示日期或时区。


LocalTime静态方法

public static LocalTime now():从默认时区的系统时钟获取当前时间。

public static LocalTime of(int hour, int minute, int second):返回一个指定小时,分钟和秒的LocalTime对象, 纳秒场将被设置为零。
参数
hour - 代表从0到23的小时
minute - 表示从0到59的小时
second - 从0到59的秒表示

public static LocalTime of(int hour,int minute, int second, int nanoOfSecond):返回一个指定的小时,分钟,秒和纳秒的LocalTime对象
参数
hour - 代表从0到23的小时
minute - 表示从0到59的小时
second - 从0到59的秒表示
nanoOfSecond - 代表从0到999,999,999的纳秒

public static LocalTime ofSecondOfDay(long secondOfDay):从一天的秒值获取LocalTime的实例。

public static LocalTime from(TemporalAccessor temporal):从TemporalAccessor 时间对象获取一个LocalTime的实例。

public static LocalTime parse(CharSequence text):从文本字符串获取一个LocalTime的实例。(如“10:15:30”)

public static LocalTime parse(CharSequence text,DateTimeFormatter formatter):使用特定的格式化LocalTime从文本字符串获取LocalTime的实例。

LocalTime非静态方法:

public long getLong(TemporalField field):从这个时间获取指定字段的值,返回的类型为long 。还有一个方法是getInt,跟这个方法差不多,就是返回的类型是int。TemporalField一些我们常用的时间字段,最常用的是它的子类ChronoField,ChronoField中定义了我们最常用的时间单位

例:

LocalTime time = LocalTime.parse("12:00:00");
System.out.println(time.getLong(ChronoField.CLOCK_HOUR_OF_DAY));

输出

12

public int getHour():获取时字段。从0到23

public int getMinute():获取分钟字段。从0到59

public int getSecond():获取秒字段的值。

public int getNano():获取纳秒值

public LocalTime with(TemporalField field, long newValue):返回此时间的副本,并将指定的字段设置为新值。

public LocalTime withHour(int hour):返回这个LocalTime的副本,并更改小时值成指定值。

public LocalTime withMinute(int minute):返回这个LocalTime的副本,分钟值更改成指定值。

public LocalTime withSecond(int second):返回这个LocalTime的副本,秒值更改成指定值。

public LocalTime withNano(int nanoOfSecond):返回此LocalTime的副本,并更改了纳秒成指定值。

public LocalTime plus(long amountToAdd,TemporalUnit unit):返回此时添加了指定数量的副本。

public LocalTime plusHours(long hoursToAdd):增加了指定的小时数,返回一个新的LocalTime 对象。plusMinutes、plusSeconds、plusNanos用法一样,只是更改的时间值不一样。

public LocalTime minusHours(long hoursToSubtract):减去指定的小时数,返回一个新的LocalTime 对象。minusMinutes、minusSeconds
、minusNanos用法一样,只是更改的时间值不一样。


LocalDateTime

LocalDateTime是一个不可变的日期时间对象,代表日期时间,通常为年 - 月 - 日 - 时 - 分 - 秒。 也可以访问其他日期和时间字段,例如日期,星期几和星期。 时间表示为纳秒精度。 例如,值“2019年10月2日在13:45.30.123456789”可以存储在LocalDateTime 。

这个类是不可变的和线程安全的。

LocalDateTime使用的是ISO-8601格式
即:uuuu-MM-dd’T’HH:mm:ss.SSSSSSSSS

声明

/**
 * @implSpec
 * This class is immutable and thread-safe.
 *
 * @since 1.8
 */
public final class LocalDateTime
        implements Temporal, TemporalAdjuster, ChronoLocalDateTime<LocalDate>, Serializable

LocalDateTime静态方法:

public static LocalDateTime now():从默认时区的系统时钟获取当前的日期时间。

public static LocalDateTime now(ZoneId zone):从指定时区的系统时钟获取当前的日期时间。

public static LocalDateTime of(int year,
Month month,
int dayOfMonth,
int hour,
int minute,
int second)
返回一个指定年月日月时分和秒LocalDateTime对象。还可以加多一个参数 int nanoOfSecond设置纳秒数

public static LocalDateTime ofInstant(Instant instant, ZoneId zone):从Instant和区域ID获取一个LocalDateTime的实例。
例:

LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault())

public static LocalDateTime from(TemporalAccessor temporal):从TemporalAccessor对象获取LocalDateTime的实例。

public static LocalDateTime parse(CharSequence text):从文本字符串获取LocalDateTime的实例,还可以加多一个 DateTimeFormatter对象的参数来格式化实例

参数
text - 要解析的文本

例:

  LocalDateTime parse = LocalDateTime.parse("2020-06-16T15:13:50");

注意:年月日后面如果要接时分秒,要加T,而不是空格


LocalDateTime非静态方法:

public int get(TemporalField field):从此LocalDateTime对象获取指定字段的值,返回类型为int 。还有一个方法getLong,使用方法一样,只是返回类型为Long

注:ChronoField为TemporalField 的子类,封装了常用的时间单位
例:

LocalDateTime date = LocalDateTime.parse("2019-02-03T15:30:30");
System.out.println(date.get(ChronoField.CLOCK_HOUR_OF_DAY));

public LocalDate toLocalDate():获取这个日期时间的LocalDate部分。

public LocalTime toLocalTime():获取此日期时间的LocalTime部分。

LocalDateTime拥有LocalDate 和LocalTime大部分 的get方法和with方法,比如getHour(),getYear(),withYear(),withHour()等

LocalDateTime的plus方法和minus也分别表示加和减,和LocalDate 、LocalTime用法相同,不懂可以看上一篇

public ZonedDateTime atZone(ZoneId zone):将此日期时间与时区组合起来创建一个ZonedDateTime 。

例:

 LocalDateTime date = LocalDateTime.parse("2020-06-03T12:30:30");
 ZonedDateTime date1 = date.atZone(ZoneId.systemDefault());

public int compareTo(ChronoLocalDateTime<?> other):将此日期时间与其他日期时间进行比较。较大则为正,较小为负

例:

        LocalDateTime now1 = LocalDateTime.now();//now为2020-06-16
        LocalDateTime date = LocalDateTime.parse("2019-02-03T15:30:30");
        System.out.println(now1.compareTo(date));

输出的是
1

1表示两者相差的年份,不懂的可以看LocalDate的compareTo0方法就知道了

比较方法源码

//先比较两个对象的LocalDate,相同再比较两个对象的LocalTime
 private int compareTo0(LocalDateTime other) {
        int cmp = date.compareTo0(other.toLocalDate());
        if (cmp == 0) {
            cmp = time.compareTo(other.toLocalTime());
        }
        return cmp;
    }

public boolean isAfter(ChronoLocalDateTime<?> other):检查这个日期时间是否在指定的日期之后。如果此日期时间在指定的日期时间后,则为true

源码如下,使用的就是LocalDateTime的compareTo0方法,比较两个LocalDateTime,如果返回值大于0,则表示该日期时间大于指定时间,即在指定时间后,很好的复用

 public boolean isAfter(ChronoLocalDateTime<?> other) {
        if (other instanceof LocalDateTime) {
            return compareTo0((LocalDateTime) other) > 0;
        }
        return ChronoLocalDateTime.super.isAfter(other);
    }

public boolean isBefore(ChronoLocalDateTime<?> other):检查此日期时间是否在指定的日期时间之前。相信大家应该知道底层调用的是什么方法了。

public boolean equals(Object obj)和public boolean isEqual(ChronoLocalDateTime<?> other)都是比较日期时间是否相等,但equals只比较类型为LocalDateTime对象,其他类型直接返回false。


版权声明:本文为qq_36551991原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。