Java: LocalDate、LocalDateTime、Duration、Period、TimeUnit类的一些用法
一、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也很好用,大家可以在实际使用中对比一下
上一篇: centos和ubuntu crontab 定时执行php文件
下一篇: mysql 常用时间函数