java.time.LocalDateTime详解

目录

静态方法

案例代码

案例代码

实例方法

转换类方法

获取类方法

替换类方法

判断类方法

增加类方法

减少类方法

其他方法


看到这篇文章的你还在用过期的时间java.util.Date吗,看完本章后,可以果断抛弃它了,因为java.time包下有他的替代品,而且功能比它更强大。

学习一个API,主要学习如何使用,接下来进入正题,介绍LocalDateTime的常用方法及使用。(因为String是CharSequence最常用的实现类,本文将使用“字符串”代替“字符序列”)

java.time.LocalDateTime是java.time.Temporal的实现类,用来表示包含年月日时分秒和纳秒的某个时间点,如:2022年9月30日9点08分55秒05纳秒。可以表示的时间范围是【-999999999年1月1日0时0分】到【999999999年12月31日23时59分59.99999999秒】

静态方法

1、static LocalDateTime now():获取当前时间,如:2022-09-30T09:44:35.750

2、static LocalDateTime of():该方法用于指定 年 月 日 时 分 秒 纳秒 创建一个LocalDateTime对象,该方法有7个重载的方法

static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute):指定年、月、日、时、分

static LocalDateTime of(int year, Month month, int dayOfMonth, int hour, int minute):指定年、月、日、时、分

static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second):指定年、月、日、时、分、秒

static LocalDateTime of(int year, Month month, int dayOfMonth, int hour, int minute, int second):指定年、月、日、时、分、秒

static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond):指定年、月、日、时、分、秒、纳秒

static LocalDateTime of(int year, Month month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond):指定年、月、日、时、分、秒、纳秒

static LocalDateTime of(LocalDate date, LocalTime time):通过指定的年月日(LocalDate )和时分秒(LocalTime )对象创建

案例代码

public class LocalDateTimeExample {
    public static void main(String[] args) {
        LocalDate date = LocalDate.now(); // 获取当前时间的年月日信息
        LocalTime time = LocalTime.now(); // 获取当前时间的时分秒信息
        LocalDateTime dateTime = LocalDateTime.of(date, time);
        
        System.out.println(date);
        System.out.println(time);
        System.out.println(dateTime);
    }

}

以上代码运行结果为:
2022-09-30
09:22:08.649
2022-09-30T09:22:08.649

3、static LocalDateTime parse():通过解析字符串生成LocalDateTime对象,该方法可以通过传入一个DateTimeFormatter指定传入字符串的格式,如2022-09-30 09:27:50

static LocalDateTime parse(CharSequence text):解析指定字符串生成LocalDateTime对象(LocalDateTime的字符串默认格式为2022-09-30T09:27:50)
【源码注释】:Obtains an instance of LocalDateTime from a text string such as 2007-12-03T10:15:30
static LocalDateTime parse(CharSequence text, DateTimeFormatter formatter):指定解析字符串的格式,通过创建DateTimeFormatter对象时指定

案例代码

public class LocalDateTimeExample {
    public static void main(String[] args) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");

        // 通过默认格式yyyy-MM-ddTHH:mm:ss解析
        System.out.println(LocalDateTime.parse("2022-09-30T08:42:30"));

        // 指定字符串格式为yyyyMMddHHmmss
        System.out.println(LocalDateTime.parse("20220930084455", formatter));
    }

}

实例方法

转换类方法

1、LocalDate toLocalDate():转为LocalDate对象

2、LocalTime toLocalTime():转为LocalTime对象

获取类方法

1、int getDayOfYear():获取当前时间是今年的第几天

2、int getDayOfMonth():获取当前时间是这个月的第几天

3、DayOfWeek getDayOfWeek():获取当前时间是这周的星期几

DayOfWeek是一个枚举,定义了每周的星期一到星期日
public enum DayOfWeek implements TemporalAccessor, TemporalAdjuster {
    MONDAY, // 星期一
    TUESDAY, // 星期二
    WEDNESDAY, // 星期三
    THURSDAY, // 星期四
    FRIDAY, // 星期五
    SATURDAY, // 星期六
    SUNDAY; // 星期日
}

4、int getYear():获取年份

5、int getMonthValue():获取月份

6、Month getMonth():获取月份,该方法返回Month对象

7、int getHour():获取小时

8、int getMinute():获取分钟

9、int getSecond():获取秒

10、int getNano():获取纳秒

替换类方法

1、LocalDateTime withYear(int year):使用指定年替换原来的年份

2、LocalDateTime withMonth(int month):使用指定月替换原来的月份

3、LocalDateTime withHour(int hour):使用指定小时替换原来的小时

4、LocalDateTime withMinute(int minute):使用指定分钟替换原来的分钟

5、LocalDateTime withSecond(int second):使用指定秒替换原来的秒

6、LocalDateTime withNano(int nanoOfSecond):使用指定纳秒替换原来的纳秒

7、LocalDateTime withDayOfMonth(int dayOfMonth):替换原来月份的第几天

8、LocalDateTime withDayOfYear(int dayOfYear):替换原来年份的第几天

public class LocalDateTimeExample {
    public static void main(String[] args) {
        LocalDateTime localDate = LocalDateTime.now();
        
        System.out.println(localDate.withYear(5));
        System.out.println(localDate.withMonth(6));
        System.out.println(localDate.withHour(7));
        System.out.println(localDate.withMinute(8));
        System.out.println(localDate.withSecond(9));
        System.out.println(localDate.withNano(10));

        // 今天是2022年9月30号
        // 今天是本月第30天,改为第11天,即9月11号
        System.out.println(localDate.withDayOfMonth(11));
        // 今天是今年的第273天,改为第12天,即1月12号
        System.out.println(localDate.withDayOfYear(12));
    }

}

以上代码的运行结果为:注意观察年份、月份、小时、分钟秒和毫秒

0005-09-30T10:36:42.285
2022-06-30T10:36:42.285
2022-09-30T07:36:42.285
2022-09-30T10:08:42.285
2022-09-30T10:36:09.285
2022-09-30T10:36:42.000000010
2022-09-11T10:36:42.285
2022-01-12T10:36:42.285

9、LocalDateTime with(TemporalField field, long newValue):指定时间域替换,关于TemporalField,您可以先通过TemporalField的简单介绍了解一下。

例如:以下两个方法的调用是等效的。

LocalDateTime dateTime = LocalDateTime.now();

dateTime.withDayOfMonth(5);
dateTime.with(ChronoField.DAY_OF_MONTH, 5);

代码运行结果:

2022-09-05T11:17:19.474
2022-09-05T11:17:19.474

判断类方法

1、boolean isAfter(ChronoLocalDateTime other):判断是否在指定时间之后

2、boolean isBefore(ChronoLocalDateTime other):判断是否在指定时间之前

3、boolean isEqual(ChronoLocalDateTime other):判断和指定时间是否相等

4、boolean isSupported(TemporalUnit unit):是否支持指定时间单位,源码中说明了LocalDateTime只支持以下单位

NANOS
MICROS
MILLIS
SECONDS
MINUTES
HOURS
HALF_DAYS
DAYS
WEEKS
MONTHS
YEARS
DECADES
CENTURIES
MILLENNIA
ERAS

5、boolean isSupported(TemporalField field):是否支持指定时间域,LocalDateTime只支持以下单位

NANO_OF_SECOND
NANO_OF_DAY
MICRO_OF_SECOND
MICRO_OF_DAY
MILLI_OF_SECOND
MILLI_OF_DAY
SECOND_OF_MINUTE
SECOND_OF_DAY
MINUTE_OF_HOUR
MINUTE_OF_DAY
HOUR_OF_AMPM
CLOCK_HOUR_OF_AMPM
HOUR_OF_DAY
CLOCK_HOUR_OF_DAY
AMPM_OF_DAY
DAY_OF_WEEK
ALIGNED_DAY_OF_WEEK_IN_MONTH
ALIGNED_DAY_OF_WEEK_IN_YEAR
DAY_OF_MONTH
DAY_OF_YEAR
EPOCH_DAY
ALIGNED_WEEK_OF_MONTH
ALIGNED_WEEK_OF_YEAR
MONTH_OF_YEAR
PROLEPTIC_MONTH
YEAR_OF_ERA
YEAR
ERA

增加类方法

1、LocalDateTime plusYears(long years):增加指定年数

2、LocalDateTime plusMonths(long months):增加指定月数

3、LocalDateTime plusWeeks(long weeks):增加指定周数

4、LocalDateTime plusDays(long days):增加指定天数

5、LocalDateTime plusHours(long hours):增加指定小时数

6、LocalDateTime plusMinutes(long minutes):增加指定分钟数

7、LocalDateTime plusSeconds(long seconds):增加指定秒数

8、LocalDateTime plusNanos(long nanos):增加指定纳秒数

9、LocalDateTime plus(TemporalAmount amountToAdd):增加指定的时间数量

10、LocalDateTime plus(long amountToAdd, TemporalUnit unit):增加指定数量的时间单位

public class LocalDateTimeExample {
    public static void main(String[] args) {
        LocalDateTime dateTime = LocalDateTime.now();

        System.out.println(dateTime);
        System.out.println(dateTime.plusYears(2));
        System.out.println(dateTime.plusMonths(2));
        System.out.println(dateTime.plusWeeks(2));
        System.out.println(dateTime.plusHours(2));
        System.out.println(dateTime.plusMinutes(2));
        System.out.println(dateTime.plusSeconds(2));
        System.out.println(dateTime.plusNanos(2));
        System.out.println(dateTime.plus(Period.ofDays(2)));
        System.out.println(dateTime.plus(2, ChronoUnit.DAYS));
    }

}

运行结果:

2022-09-30T14:36:10.986
2024-09-30T14:36:10.986
2022-11-30T14:36:10.986
2022-10-14T14:36:10.986
2022-09-30T16:36:10.986
2022-09-30T14:38:10.986
2022-09-30T14:36:12.986
2022-09-30T14:36:10.986000002
2022-10-02T14:36:10.986
2022-10-02T14:36:10.986

减少类方法

减少类方法plus()和plusXxxs()和增加类方法用法类似,这里就不介绍了。

其他方法

1、ValueRange range(TemporalField field):获取LocalDateTime支持的时间域的范围,如:

LocalDateTime dateTime = LocalDateTime.now();
// 一天有24小时,所以支持0~23
System.out.println(dateTime.range(ChronoField.HOUR_OF_DAY)); // 0-23

2、LocalDateTime truncatedTo(TemporalUnit unit):控制时间只显示到指定单位,TemporalUnit 请参考TemporalUnit简单介绍,最少会显示到分钟,更小的的单位不显示或显示为0,指定的单位最大为天,即最少可以显示为年月日(如:参数指定为分钟则秒不会显示,指定为小时,分钟会显示为00)

public class LocalDateTimeExample {
    public static void main(String[] args) {
        LocalDateTime dateTime = LocalDateTime.now();

        System.out.println(dateTime.truncatedTo(ChronoUnit.DAYS));
        System.out.println(dateTime.truncatedTo(ChronoUnit.HOURS));
        System.out.println(dateTime.truncatedTo(ChronoUnit.MINUTES));
        System.out.println(dateTime.truncatedTo(ChronoUnit.SECONDS));
        System.out.println(dateTime.truncatedTo(ChronoUnit.MILLIS));
    }

}

以上代码运行结果为:

2022-09-30T00:00
2022-09-30T11:00
2022-09-30T11:56
2022-09-30T11:56:48
2022-09-30T11:56:48.042

3、String format(DateTimeFormatter formatter):将时间格式化为字符串,可以通过接收的DateTimeFormatter对象指定转换的日期字符串格式

public class LocalDateTimeExample {
    public static void main(String[] args) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
        LocalDateTime localDate = LocalDateTime.now();
        String format = localDate.format(formatter);

        System.out.println(format); // 20220930120236
    }

}

对比Date,java.util.Date通过java.text.SimpleDateFormat格式化

public class LocalDateTimeExample {
    public static void main(String[] args) {
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
        Date date = new Date();
        String format = format.format(date);

        System.out.println(format);
    }
}

4、long until(Temporal endExclusive, TemporalUnit unit):计算指定时间离当前时间相差多少个指定的时间单位,如果指定时间endExclusive在当前时间之前,返回负数

public class LocalDateTimeExample {
    public static void main(String[] args) {
        LocalDateTime dateTime = LocalDateTime.now();
        LocalDateTime time = LocalDateTime.of(2022, 9, 30, 14, 5, 50);
        long hours = dateTime.until(time, ChronoUnit.HOURS);
        long minutes = dateTime.until(time, ChronoUnit.MINUTES);
        long seconds = dateTime.until(time, ChronoUnit.SECONDS);

        System.out.println(dateTime);
        System.out.println(time);
        System.out.println(hours);
        System.out.println(minutes);
        System.out.println(seconds);
    }

}

以上代码运行结果为:

2022-09-30T14:13:12.829
2022-09-30T14:05:50
0
-7
-442

结果解析:运行时刻的时间为14:13:12.289,指定时间为14:05:50,两者相差了7分钟,没有问题,相差了(442 = 7 * 60 + 22)秒,即7分钟22秒,也没问题。


 

你可能感兴趣的:(java)