download:轻松实现Rust系统入门,实战编译器开发 Calendar 日历类 public static void main(String[] args) { Calendar calendar = Calendar.getInstance(); int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH); int dom = calendar.get(Calendar.DAY_OF_MONTH); int doy = calendar.get(Calendar.DAY_OF_YEAR); int dow = calendar.get(Calendar.DAY_OF_WEEK); int dowim = calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH); System.out.println(year+"年"+ month+"月"); System.out.println(dom+"日"); System.out.println(doy+"日"); System.out.println(dow+"日"); System.out.println(dowim); } 复制代码 打印(运转时间2021年10月27日 星期三 晴) 2021年9月 27日 300日 4日 4 复制代码 问:月份怎样是上个月的? 答:是为了计算便当,月是0到11之间的值。 问:计算便当? 答:比方月份从1月开端,增加一个月,12月+1=13,没有13月。假定取余,(12+1)%12=1 正好为1月,那11月增加一个月,(11+1)%12=0,这就有问题了。所以为了计算便当1月,返回了0值。date.getMonth()也是一个道理。 问:那下面的DAY_OF_XXX 又是什么意义? 答:猜!依据结果猜。 Calendar.DAY_OF_MONTH 在这个月 的这一天 Calendar.DAY_OF_YEAR 在这一年 的这一天 Calendar.DAY_OF_WEEK 在这一周 的这一天 Calendar.DAY_OF_WEEK_IN_MONTH 在这一个月 这一天在 第几周 到这里 Calendar.DAY_OF_WEEK 为什么是 4 ,你肯定也猜到了 Calendar.HOUR Calendar.HOUR_OF_DAY Calendar.SECOND ...其他的 你肯定也会用了 LocalDate 本地日期类 LocalDate localDate = LocalDate.now(); System.out.println("当前日期:"+localDate.getYear()+" 年 "+localDate.getMonthValue()+" 月 "+localDate.getDayOfMonth()+"日" ); //结果 当前日期:2021 年 10 月 27日 复制代码 也能够经过 LocalDate.of(年,月,日)去结构 LocalDate pluslocalDate = localDate.plusDays(1);//增加一天 LocalDate pluslocalDate = localDate.plusYears(1);//增加一年 复制代码 其他api LocalDate.isBefore(LocalDate); LocalDate.isAfter(); LocalDate.isEqual(); 复制代码 也就是对两个日期的判别,是在前、在后、或者相等。 LocalTime 本地时间类 LocalTime localTime = LocalTime.now(); System.out.println("当前时间:"+localTime.getHour()+"h "+localTime.getSecond()+"m "+localTime.getMinute()+"s" ); 复制代码 LocalDate和LocalTime 都有相似作用的api LocalDate.plusDays(1) 增加一天 LocalTime.plusHours(1) 增加一小时 等等~ 其他api LocalTime.isBefore(LocalTime); LocalTime.isAfter(); 复制代码 对两个时间的判别。肯定碰到过一个需求,今天离活动开端时间还剩几天。 LocalDateTime 本地日期时间类 public final class LocalDateTime ...{ private final LocalDate date; private final LocalTime time; } 复制代码 LocalDateTime = LocalDate + LocalTime 懂的都懂 Instant 类 Instant 是霎时,某一时辰的意义 Instant.ofEpochMilli(System.currentTimeMillis()) Instant.now() 复制代码 经过Instant能够创立一个 “霎时” 对象,ofEpochMilli()能够承受某一个“霎时”,比方当前时间,或者是过去、未来的一个时间。 比方,经过一个“霎时”创立一个LocalDateTime对象 LocalDateTime now = LocalDateTime.ofInstant( Instant.ofEpochMilli(System.currentTimeMillis()),ZoneId.systemDefault()); System.out.println("当前日期:"+now.getYear()+" 年 "+now.getMonthValue()+" 月 "+now.getDayOfMonth()+"日" ); 复制代码 Period 类 Period 是 时期,一段时间 的意义 Period有个between办法特地比拟两个 日期 的 LocalDate startDate = LocalDateTime.ofInstant( Instant.ofEpochMilli(1601175465000L), ZoneId.systemDefault()).toLocalDate();//1601175465000是2020-9-27 10:57:45 Period p = Period.between(startDate, LocalDate.now()); System.out.println("目的日期间隔今天的时间差:"+p.getYears()+" 年 "+p.getMonths()+" 个月 "+p.getDays()+" 天" ); //目的日期间隔今天的时间差:1 年 1 个月 1 天 复制代码 看一眼源码 public static Period between(LocalDate startDateInclusive, LocalDate endDateExclusive) { return startDateInclusive.until(endDateExclusive); } public Period until(ChronoLocalDate endDateExclusive) { LocalDate end = LocalDate.from(endDateExclusive); long totalMonths = end.getProlepticMonth() - this.getProlepticMonth(); // safe int days = end.day - this.day; if (totalMonths > 0 && days < 0) { totalMonths--; LocalDate calcDate = this.plusMonths(totalMonths); days = (int) (end.toEpochDay() - calcDate.toEpochDay()); // safe } else if (totalMonths 0) { totalMonths++; days -= end.lengthOfMonth(); } long years = totalMonths / 12; // safe int months = (int) (totalMonths % 12); // safe return Period.of(Math.toIntExact(years), months, days); } 复制代码 他只承受两个LocalDate对象,对时间的计算,算好之后返回Period对象 Duration 类 Duration 是 期间 持续时间 的意义 上代码 LocalDateTime end = LocalDateTime.ofInstant(Instant.ofEpochMilli(System.currentTimeMillis()), ZoneId.systemDefault()); LocalDateTime start = LocalDateTime.ofInstant(Instant.ofEpochMilli(1601175465000L), ZoneId.systemDefault()); Duration duration = Duration.between(start, end); System.out.println("开端时间到完毕时间,持续了"+duration.toDays()+"天"); System.out.println("开端时间到完毕时间,持续了"+duration.toHours()+"小时"); System.out.println("开端时间到完毕时间,持续了"+duration.toMillis()/1000+"秒"); 复制代码 能够看到between也承受两个参数,LocalDateTime对象,源码是对两个时间的计算,并返回对象。 对象转换 再贴点api //long -> LocalDateTime LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.systemDefault()) //String -> LocalDateTime DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime.parse("2021-10-28 00:00:00", dateTimeFormatter1); //LocalDateTime -> long LocalDateTime对象.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); //LocalDateTime -> String DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime对象.format(dateTimeFormatter1) 复制代码 对象转换简直都涵盖了,里面有个时区对象,这个普通用默许时区。 总结 用LocalDate、LocalTime、LocalDateTime替代了Date类。Date管日期,Time管时间 LocalDateTime = LocalDate + LocalTime Period 只能用LocalDate Duration 持续时间,所以LocalDate、LocalTime、LocalDateTime 都能处置 至于Calendar 日历类,这里面的api,都是针对日历的,比方这个月的第一天是星期几。 总体来说,都是api的运用,十分明晰,废弃date.getMonth()等,运用localDate.getMonthValue()来获取几月,更易了解,更易贴合运用。