关于java:语言Java-日期-API-的使用技巧

30次阅读

共计 3014 个字符,预计需要花费 8 分钟才能阅读完成。

前言

在日常开发中,咱们常常会应用到一些无关日期相干的数据操作,比方:获取日期对应周几、获取一个月中存在等获取工夫的操作。

而在 Java 8 之前的日期 API 设计是十分反人类的。应用 new Date() 创立的工夫,获取年份的时候,是通过从 1900 开始 1 计算,而且获取的月份 0 代表 1 月份。并且应用时无奈保障线程平安,多个线程操作时,可能会出问题。

到了 Java 8 将工夫的 API 进行从新的设计,明确拆散,它为日期(Date)、工夫(Time)、日期工夫(DateTime)、工夫戳(unix timestamp)以及时区定义了不同的类,而且所有类是不可变的,保障了应用中线程平安问题。

本文将对开发中罕用的案例,进行解说,不便大家高效开发。

外围类

Java 8 日期工夫的默认格局如下:yyyy-MM-dd-HH-mm-ss.zzz

几个次要的外围类:

  • LocalDate:示意日期类,不蕴含工夫时分秒
  • LocalTime:示意工夫类,不蕴含日期月日年
  • LocalDateTime:示意日期和工夫类
  • ZonedDateTime:示意时区日期工夫类
  • OffsetDateTime:示意按 UTC 工夫偏移来失去日期工夫
  • Clock:示意获取某个时区下以后的刹时工夫,日期或者工夫
  • Instant:示意 Unix 工夫,代表工夫戳,比方 2018-01-14T02:20:13.592Z
  • Duration:示意两个工夫之间,示意一个相对的准确跨度,应用毫秒为单位
  • Period:示意两个日期之间
  • ZoneId:示意时区
  • DateTimeFormatter:示意格式化输入
  • TemporalAdjusters:示意取得指定日期工夫等,如当月的第一天、往年的最初一天等等

罕用案例

获取今日的日期

应用 LocalDate 对象的 now() 能够间接拿到今日的日期。而后通过 DateTimeFormatter 能够对日期进行格式化打印。

LocalDate localDate = LocalDate.now();
System.out.println("明天日期是:"+localDate);
DateTimeFormatter fmtDate = DateTimeFormatter.ofPattern("yyyyMMdd");
System.out.println("明天日期格式化:"+localDate.format(fmtDate));

/**
 * -------- 打印 --------
 * 明天日期是:2021-11-12
 * 明天日期格式化:20211112
 */

获取日期中的年月日

LocalDate localDate = LocalDate.now();
int year = localDate.getYear();
int month = localDate.getMonthValue();
int day = localDate.getDayOfMonth();
System.out.println("年:"+year);
System.out.println("月:"+month);
System.out.println("日:"+day);

/**
 * -------- 打印 --------
 * 年:2021
 * 月:11
 * 日:12
 */

比拟不同日期

LocalDate 对象能够通过 equals() / isAfter() / isBefore() 办法对日期进行比拟,十分不便。

LocalDate localDate = LocalDate.now();
LocalDate localDateOther = LocalDate.of(2021,11,11);
System.out.println("localDate 等于 localDateOther:"+localDate.equals(localDateOther));
System.out.println("localDate 大于 localDateOther:"+localDate.isAfter(localDateOther));
System.out.println("localDate 小于 localDateOther:"+localDate.isBefore(localDateOther));

/**
 * -------- 打印 --------
 *localDate 等于 localDateOther:false
 *localDate 大于 localDateOther:true
 *localDate 小于 localDateOther:false
 */

获取以后工夫

应用 LocalTime 对象的 now() 能够间接拿到今日的工夫,不蕴含日期。

LocalTime nowTime = LocalTime.now();
System.out.println("以后工夫为:"+nowTime);

/**
 * -------- 打印 --------
 * 以后工夫为:12:56:17.908
 */

日期工夫的计算

应用 LocalTime 对象的 now() 能够间接拿到今日的工夫,不蕴含日期。

LocalDate localDate = LocalDate.of(2021,11,11);
LocalTime nowTime = LocalTime.now();
LocalDate tempDate;
LocalTime tempTime;

tempDate = localDate.with(TemporalAdjusters.previous(DayOfWeek.MONDAY)).minusDays(7);
System.out.println("往年双 11 上周周一是:"+tempDate);

DayOfWeek dayOfWeek = localDate.getDayOfWeek();
System.out.println("往年双 11 是周几?:"+dayOfWeek);

tempTime = nowTime.plusHours(5).plusMinutes(20);
System.out.println("五小时 20 分钟后是:"+tempTime);

tempTime = nowTime.minusHours(3);
System.out.println("3 小时前是:"+tempTime);

/**
 * -------- 打印 --------
 * 往年双 11 上周周一是:2021-11-01
 * 往年双 11 是周几?:THURSDAY
 * 五小时 20 分钟后是:18:28:44.508
 * 3 小时前是:10:08:44.508
 */

计算两个日期之间的距离

应用 LocalTime 对象的 now() 能够间接拿到今日的工夫,不蕴含日期。

LocalDate localDate = LocalDate.of(2019,5,1);
LocalDate localDateOther = LocalDate.of(2021,11,11);
Period period = Period.between(localDate, localDateOther);
System.out.println("Years:" + period.getYears() +"months:" + period.getMonths() +"days:"+period.getDays());

/**
 * -------- 打印 --------
 *Years:2 months:6 days:10
 */

总结

通过 LocalDateLocalTime 的应用,能够对于常见的业务场景的工夫日期进行高效的计算,更多还是本人去入手去实际吧。

正文完
 0