6

Java8的LocalDateTime还没搞懂?一文轻松解决掉你的烦恼

 1 year ago
source link: https://www.51cto.com/article/751241.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

哈喽,大家好,我是了不起。

LocalDateTime 是Java8中新加入的日期时间类,现在都 Java20 了,不会还有人没用过 LocalDateTime 吧?

今天给大家演示一下 LocalDateTime 的常用方法。

LocalDateTime、LocalDate、LocalTime 是 Java8 全新的日期框架,加强了对时间的管理,有很多特别好用的时间运算方法,而且是线程安全的,较之前的 util.Date 以及 Calander 使用起来更加的方便直观,下面介绍几种常见的日期对象用法。

  • LocalDateTime:日期加时间的日期对象,包含年月日时分秒
  • LocalDate:日期类,包含年月日
  • LocalTime:时间类,包含时分秒

LocalDateTime

获取当前时间

@Test
public void test() {
    LocalDate localDate = LocalDate.now();
    LocalTime localTime = LocalTime.now();
    LocalDateTime localDateTime = LocalDateTime.now();
    System.out.println("localDate:"+localDate);//2023-02-22
    System.out.println("localTime:"+localTime);//17:25:36.590
    System.out.println("localDateTime:"+localDateTime);//2023-02-22T17:25:36.590
}

输出结果:

图片

可以看到不用做格式转换就可以得到可读性很高的日期格式。注意:ISO 8601规定的日期和时间分隔符是T。标准格式如下:

  • 日期:yyyy-MM-dd
  • 时间:HH:mm:ss
  • 带毫秒的时间:HH:mm:ss.SSS
  • 日期和时间:yyyy-MM-dd'T'HH:mm:ss
  • 带毫秒的日期和时间:yyyy-MM-dd'T'HH:mm:ss.SSS

获取当前时间的年月日时分秒

@Test
public void test() {
    LocalDateTime localDateTime = LocalDateTime.now(); // 获取当前时间
    int year = localDateTime.getYear(); // 获取年份 2023
    int month = localDateTime.getMonthValue(); // 获取月份 2
    int day = localDateTime.getDayOfMonth(); // 获取月中的天数 22
    int hour = localDateTime.getHour(); // 获取当前的小时 17
    int minute = localDateTime.getMinute(); // 获取当前分钟 33
    int second = localDateTime.getSecond(); // 获取当前秒数 22
    System.out.println(year);
    System.out.println(month);
    System.out.println(day);
    System.out.println(hour);
    System.out.println(minute);
    System.out.println(second);
}

输出结果:

图片

给LocalDateTime赋值

在static目录中新建kaptcha.html页面,代码如下:

public void test() {
    LocalDateTime of = LocalDateTime.of(2023,2,22,22,22,22);
    System.out.println(of); // 输出2023-02-22T22:22:22
}

时间与字符串相互转换

@Test
public void test() {
    // 将字符串转换为指定格式的时间(格式要和给定的格式一致,不然会报错)
    LocalDateTime parse = LocalDateTime.parse("2023-02-22 22:22:22", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    LocalDateTime parse1 = LocalDateTime.parse("2023 02 22 22:22:22", DateTimeFormatter.ofPattern("yyyy MM dd HH:mm:ss"));
    LocalDateTime parse2 = LocalDateTime.parse("2023.02.22 22:22:22", DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss"));
    System.out.println(parse); // 输出2023-02-22T22:22:22
    System.out.println(parse1); // 输出2023-02-22T22:22:22
    System.out.println(parse2); // 输出2023-02-22T22:22:22
    // 时间转字符串
    LocalDateTime now = LocalDateTime.now();
    DateTimeFormatter of = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    String dateTime = now.format(of);
    System.out.println(dateTime); // 输出 2023-02-22 17:56:18
}

输出结果:

图片

时间运算:加上对应时间

LocalDateTime提供了对日期和时间进行加减的非常简单的链式调用,让时间运算变得非常简单:

@Test
public void test() {
    LocalDateTime now = LocalDateTime.now(); // 当前时间2023-02-22T18:00:19.352
    LocalDateTime plusYears= now.plusYears(2); // 在当前时间加上2年2025-02-22T18:00:19.352
    LocalDateTime plusMnotallow= now.plusMonths(2);// 在当前时间商加上2月2023-04-22T18:00:19.352
    LocalDateTime plusDays= now.plusDays(2); // 在当前时间加上2天2023-02-24T18:00:19.352
    LocalDateTime plusHours= now.plusHours(2); // 在当前时间加上2个小时2023-02-22T20:00:19.352
    LocalDateTime plusMinutes= now.plusMinutes(30); // 在当前时间加上30分钟2023-02-22T18:30:19.352
    LocalDateTime plusSeconds = now.plusSeconds(30); // 在当前时间加上30秒2023-02-22T18:00:49.352
    System.out.println(now);
    System.out.println(plusYears);
    System.out.println(plusMonths);
    System.out.println(plusDays);
    System.out.println(plusHours);
    System.out.println(plusMinutes);
    System.out.println(plusSeconds);
}

输出结果:

图片

时间运算:减去对应时间

@Test
public void test() {
    LocalDateTime now = LocalDateTime.now(); // 当前时间
    LocalDateTime minusYears = now.minusYears(2); // 在当前时间减上2年
    LocalDateTime minusMonths = now.minusMonths(2);// 在当前时间商减上2月
    LocalDateTime minusDays = now.minusDays(2); // 在当前时间减上2天
    LocalDateTime minusHours = now.minusHours(2); // 在当前时间减上2个小时
    LocalDateTime minusMinutes = now.minusMinutes(30); // 在当前时间减上30分钟
    LocalDateTime minusSeconds = now.minusSeconds(30); // 在当前时间减上30秒
    System.out.println("now:" + now);
    System.out.println("minusYears:" + minusYears);
    System.out.println("minusMonths:" + minusMonths);
    System.out.println("minusDays:" + minusDays);
    System.out.println("minusHours:" + minusHours);
    System.out.println("minusMinutes:" + minusMinutes);
    System.out.println("minusSeconds:" + minusSeconds);
}

输出结果:

图片

两个时间比较

@Test
public void test() {
    LocalDateTime now = LocalDateTime.now(); // 当前时间
    LocalDateTime now1 = now.plusYears(5); // 在当前时间加上5年
    //  给LocalDateTime 赋值
    LocalDateTime of = LocalDateTime.of(2023,2,2,22,22,22);
    LocalDateTime of1 = LocalDateTime.of(2023,8,5,1,1,1);
    //两个时间作比较,第一个时间减去第二个时间(如果年份相同,比较月份,月份相同比较天数,以此类推)
    int compareTo = now1.compareTo(now);
    int compareTo1 = now.compareTo(now1);
    int compareTo2 = now.compareTo(of);
    int compareTo3 = now.compareTo(of1);
    System.out.println(now);   // 输出 2023-02-22T20:19:44.112v
    System.out.println(now1); // 输出 2028-02-22T20:19:44.112
    System.out.println(of); // 输出 2023-02-02T22:22:22
    System.out.println(of1); // 输出 2023-08-05T01:01:01
    System.out.println(compareTo); // 输出 5
    System.out.println(compareTo1); // 输出 -5
    System.out.println(compareTo2); // 输出 20
    System.out.println(compareTo3); // 输出 -6
}

输出结果:

图片

利用Duration计算时间差

注意没有计算相差的年和秒值,对于要计算相差的秒数,可以利用计算毫秒来进行转换

@Test
public void test() {
    LocalDateTime now = LocalDateTime.now(); // 当前时间
    //  给LocalDateTime 赋值
    LocalDateTime of = LocalDateTime.of(2022,2,22,2,2,2);
    Duration duration = Duration.between(of,now); // 后面减去前面
    long toDays = Duration.between(of,now).toDays(); //相差的天数
    long toHours = Duration.between(of,now).toHours();//相差的小时数
    long toMinutes = Duration.between(of,now).toMinutes();//相差的分钟数
    long toMillis = Duration.between(of,now).toMillis();//相差毫秒数
    long toNanos = Duration.between(of,now).toNanos();//相差的纳秒数
    System.out.println("toDays:"+ toDays); // 输出 toDays:365
    System.out.println("toHours:"+ toHours); // 输出 toHours:8778
    System.out.println("toMinutes:"+ toMinutes); // 输出 toMinutes:526732
    System.out.println("toMillis:"+ toMillis); // 输出 toMillis:31603973840
    System.out.println("toNanos:"+ toNanos); // 输出 toNanos:31603973840000000
}

输出结果:

图片

改变当前时间的年月日时分秒

@Test
public void test() {
    LocalDateTime now = LocalDateTime.now(); // 当前时间
    LocalDateTime withYear = now.withYear(2060); // 改变当前年份(变成2060年)
    LocalDateTime withMonth = now.withMonth(12); // 改变当前月份(变成12月份)
    LocalDateTime withDayOfMonth = now.withDayOfMonth(28); //改变当前天数(变成28日)
    LocalDateTime withHour = now.withHour(23); // 改变当前小时数(变成23时)
    LocalDateTime withMinute = now.withMinute(30); // 改变当前分钟(变成30分钟)
    LocalDateTime withSecond = now.withSecond(23); // 改变当前小时数(变成23时)
    LocalDateTime withDayOfYear = now.withDayOfYear(60); // 从一月一号开始加上60天
    System.out.println(now);
    System.out.println("withYear:"+ withYear);
    System.out.println("withMonth:"+ withMonth);
    System.out.println("withDayOfMonth:"+ withDayOfMonth);
    System.out.println("withHour:"+ withHour);
    System.out.println("withMinute:"+ withMinute);
    System.out.println("withSecond:"+ withSecond);
    System.out.println("withDayOfYear:"+ withDayOfYear);
}

输出结果:

图片

自定义输出的格式

@Test
public void test() {
    // 自定义格式化:
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
    DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss");
    System.out.println("自定义格式yyyy/MM/dd HH:mm:ss :"+dtf.format(LocalDateTime.now()));
    System.out.println("自定义格式yyyy.MM.dd HH:mm:ss :"+dtf1.format(LocalDateTime.now()));

    // 用自定义格式解析:
    LocalDateTime dt2 = LocalDateTime.parse("2020/10/20 15:16:17", dtf);
    System.out.println("格式解析:"+dt2);
}

输出结果:

图片

LocalDateTime的with()方法

@Test
public void test() {
    // 本月第一天0:00时刻:
    LocalDateTime firstDay = LocalDate.now().withDayOfMonth(1).atStartOfDay();
    // 本月最后1天:
    LocalDate lastDay = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
    // 下月第1天:
    LocalDate nextMonthFirstDay = LocalDate.now().with(TemporalAdjusters.firstDayOfNextMonth());
    // 本月第1个周一:
    LocalDate firstWeekday = LocalDate.now().with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY));
}

两个日期前后的比较与判断

@Test
public void test() {
    //判断两个时间点的前后
    LocalDateTime now = LocalDateTime.now();
    LocalDateTime target = LocalDateTime.of(2022, 2, 22, 22, 22, 22);
    boolean isBefore = now.isBefore(target);
    System.out.println("now:"+now);
    System.out.println("target:"+target);
    System.out.println("isBefore:"+isBefore);
    System.out.println(LocalDate.now().isBefore(LocalDate.of(2022, 2, 22)));
    System.out.println(LocalTime.now().isAfter(LocalTime.parse("08:15:00")));
}

输出结果:

图片

LocalDateTime获取时间以及计算都非常方便,而且是线程安全的,建议使用LocalDateTime。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK