欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java: LocalDate、LocalDateTime、Duration、Period、TimeUnit类的一些用法

程序员文章站 2024-01-22 20:05:10
...

一、LocalDate

  • 初始化操作
// 获取当前年月日
LocalDate now = LocalDate.now();
System.out.println(now); // 2021-03-13
// 指定年、月、日创建日期
LocalDate d = LocalDate.of(2077, 1, 1);
System.out.println(d); // 2077-01-01
// 通过字符串形式创建
LocalDate d1 = LocalDate.parse("2077-10-01");
System.out.println(d1); // 2077-10-01
// 获取某年第x天的日期,比如这里是获取2077年第10天的日期是多少
LocalDate d2 = LocalDate.ofYearDay(2077, 10);
System.out.println(d2); // 2077-01-10
// withYear、withMonth等操作同下
LocalDate now = LocalDate.now(); // 2021-03-13
System.out.println(now.withYear(2020)); // 2020-03-13

// 获取当前月的第一天,等同于 now.with(TemporalAdjusters.firstDayOfMonth())
System.out.println(now.withDayOfMonth(1)); // 2021-03-01
// 获取当天月的最后一天
System.out.println(now.with(TemporalAdjusters.lastDayOfMonth())); // 2021-03-31

TemporalAdjusters 类中还有一些比较好用的用法,比如获取下个月的第一天:.firstDayOfNextMonth(), 下一年的第一天:.firstDayOfNextYear()

  • 获取操作
LocalDate now = LocalDate.now(); // 2021-03-13
// 获取年,等同于 now.get(ChronoField.YEAR)
System.out.println(now.getYear()); // 2021
// 获取月,等同于 now.get(ChronoField.MONTH_OF_YEAR)
System.out.println(now.getMonthValue()); // 3
// 获取月,返回的是英文
System.out.println(now.getMonth()); // MARCH
// 获取日,等同于 now.get(ChronoField.DAY_OF_MONTH)
System.out.println(now.getDayOfMonth()); // 13
// 获取当天到是在当天的第几天(也即距离当年1月1日有多少天),等同于 now.get(ChronoField.DAY_OF_YEAR)
System.out.println(now.getDayOfYear()); // 72,表示距离2021-01-01有72天
// 获取当天是一周中的第几天
System.out.println(now.get(ChronoField.DAY_OF_WEEK)); // 6,今天周六
// 获取当天是一周中的周几(返回英文)
System.out.println(now.getDayOfWeek()); // SATURDAY
// 当年是不是闰年
System.out.println(now.isLeapYear()); // false
  • 日期加减或者比较操作
LocalDate now = LocalDate.now(); // 2021-03-13
// 当前天加多少天,等同于 now.plus(3, ChronoUnit.DAYS)
System.out.println(now.plusDays(3)); // 2021-03-16
// 当前天减多少天,等同于 now.minus(14, ChronoUnit.MONTHS)
System.out.println(now.minusMonths(14)); // 2020-01-13
// plusWeeks()、plusYears()、minusDays() 操作同此
LocalDate nextYear = LocalDate.now().plusYears(1);
// isBefore、isAfter、isEqual用法
System.out.println(nextYear.isAfter(now)); // true
System.out.println(nextYear.isEqual(LocalDate.now().plusYears(1))); // true

二、LocalTime

LocalDate 类似,可以从系统时钟或使用 “parse” 和 “of” 方法创建 LocalTime 实例

LocalTime now = LocalTime.now(); // 13:54:57.477
System.out.println(now);
// 加2小时
System.out.println(now.plusHours(2)); // 15:55:28.330
LocalTime time = LocalTime.parse("14:05");
System.out.println(time); // 14:05
// 获取时、分、秒
System.out.println(time.getHour()); // 14
// 获取LocalTime的最大时间
System.out.println(LocalTime.MAX); // 23:59:59.999999999

三、LocalDateTime

日期和时间的组合 也是使用比较多的,API和 LocalDate、LocalTime 差不多

LocalDateTime now = LocalDateTime.now();
System.out.println(now); // 2021-03-13T14:01:32.697
// 注意.parse()的时候,年月日和时分秒之间是个“T”,不写或者用空格都会报异常
LocalDateTime dateTime = LocalDateTime.parse("2020-01-01T12:05:05");
System.out.println(dateTime); // 2020-01-01T12:05:05
LocalDateTime timeOf = LocalDateTime.of(2020, 10, 2, 10, 10, 10);
System.out.println(timeOf); // 2020-10-02T10:10:10

以 下 为 时 区 的 一 些 扩 展 资 料 , 方 便 大 家 了 解 \color{green} {以下为时区的一些扩展资料,方便大家了解} 便

方法名 描述
ZoneId zoneId = ZoneId.systemDefault(); 获取默认时区
ZoneId zoneId = ZoneId.of(“Asia/Shanghai”); 根据时区参数初始化时区
Set allZoneIds = ZoneId.getAvailableZoneIds(); 获取所有时区

四、Period 和 Duration

  • 二者的区别

Period : 用于计算两个日期(年月日)间隔
Duration : 用于计算两个时间(秒,纳秒)间隔

  • Period 用法
// 初始化一个5天时间的时间间隔
Period period = Period.ofDays(5);
LocalDate now = LocalDate.now(); // 2021-03-13
// 给当前时间加上一个5天时间间隔,相当于 now.plusDays(5)
System.out.println(now.plus(period)); // 2021-03-18
LocalDate d1 = LocalDate.of(2019, 12, 1);
LocalDate d2 = LocalDate.of(2021, 2, 15);
// 计算两个日期之间的时间差
Period period1 = Period.between(d1, d2);
System.out.println(period1.getYears()); // 1年
System.out.println(period1.getMonths()); // 2月
System.out.println(period1.getDays()); // 14天
// 创建一个3年2个月1天的时间间隔
Period period2 = Period.of(3, 2, 1);
System.out.println(now.plus(period2)); // 2024-05-14

练 习 题 : \color{red} {练习题:}
已知你的女神的生日是2000年5月20日,请用上述学到的知识计算你和你的女神生日相差多少天、多少分、多少秒。
算出结果了请在评论区留言 ????

  • Duration 用法

用法和Period类似,不过使用的维度更多是时、分、秒

LocalTime d1 = LocalTime.parse("12:10:23");
LocalTime now = LocalTime.now();
System.out.println(now); // 14:50:07.287
System.out.println(Duration.between(d1, now).getSeconds()); // 9584
System.out.println(Duration.between(d1, now).toHours()); // 2

扩展:计算程序的执行时间

LocalTime t1 = LocalTime.now();
// 模拟耗时的代码逻辑开始
for (int i = 0; i < 1000; i++) {
    System.out.println(i);
    Thread.sleep(1);
}
// 模拟耗时的代码逻辑结束
LocalTime t2 = LocalTime.now();
System.out.println("代码执行耗时:"+ Duration.between(t1, t2).getSeconds() + "秒");

五、TimeUnit

TimeUnit类一般用于时、分、秒之间的转换或者线程休眠

TimeUnit.DAYS          //天
TimeUnit.HOURS         //小时
TimeUnit.MINUTES       //分钟
TimeUnit.SECONDS       //秒
TimeUnit.MILLISECONDS  //毫秒

public long toMillis(long d)    //转化成毫秒
public long toSeconds(long d)  //转化成秒
public long toMinutes(long d)  //转化成分钟
public long toHours(long d)    //转化成小时
public long toDays(long d)     //转化天
  • 用于时分秒之间的转换
// 分钟转小时
System.out.println(TimeUnit.MINUTES.toHours(120)); // 2
// 天转小时
System.out.println(TimeUnit.DAYS.toHours(365)); // 8760
// 天转小时, 与TimeUnit.DAYS.toHours(365)效果等同
System.out.println(TimeUnit.HOURS.convert(365, TimeUnit.DAYS)); // 8760
  • 用于线程休眠

和Thread.sleep() 不同的地方是我们不需要将时、分、秒手动转换成毫秒,简化了操作,比如下面的例子,假如要线程休眠10小时,明显 TimeUnit.HOURS.sleep(10) 要比 Thread.sleep(10 * 60 * 60 * 1000) 要简化得多,其实 TimeUnit.HOURS.sleep() 底层也是调用的Thread.sleep(),有兴趣的同学可以去看下源码

for (int i = 0; i < 100; i++) {
    System.out.println(i);
    // 休息1秒,底层调用的是Thread.sleep(1)
    TimeUnit.SECONDS.sleep(1);
    // 睡眠1分钟
    // TimeUnit.MINUTES.sleep(1);
    // 线程自带的休眠方式,这里休眠10个小时,要转成毫秒,麻烦,可以直接用 TimeUnit.HOURS.sleep(10);
    // Thread.sleep(10 * 60 * 60 * 1000);
}

六、LocalDate(Time) 和Date的互转、时间格式化

Java8以后,操作时间日期类变得很方便,包括像Mybatis-Plus等工具,在生成代码的时会自动将数据库的的时间类型字段映射成LocalDate或者LocalDateTime,下面是LocalDate或者LocalDateTime与Date类型互转的方法:

  • LocalDateTime 转 Date
LocalDateTime now = LocalDateTime.now();
Date date = Date.from(now.atZone(ZoneId.systemDefault()).toInstant());
  • Date 转 LocalDateTime
Date date = new Date();
LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
  • 时间格式化
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(df.format(LocalDateTime.now())); // 2021-03-13 15:17:24

七、结语

以上就是对Java中的时间操作类的一些总结,希望大家都动手实践,毕竟,练过后才是自己的
在Java8之前,还有些操作时间的工具类,比如Joda-Time也很好用,大家可以在实际使用中对比一下

相关标签: Java java