时间新特性
- 新生事物出现,必定是对旧事物的完善或者是缺陷的弥补。
- 本文章介绍LocalDate、LocalDateTime。在多线程的情况,相比较于Date、Calendar、SimpleDateFormat或DateFormat下的其他子类而言。这些类都是线程安全且性能更好,代码更加简洁
LocalDate
- 一个不可变的时间日期对象,表示日期,表现为年月日(2010-10-10),在对LocalDate对象进行
加减修改操
作后,返回的都是一个不可变的新日期对象
创建方式
| |
| LocalDate now = LocalDate.now(); |
| |
| |
| LocalDate of = LocalDate.of(2022, 1, 1); |
| |
| |
| LocalDate start = LocalDate.parse("2023-03-01"); |
| |
| LocalDate now4 = LocalDate.now(ZoneId.of("Asia/Shanghai")); |
- 其实指定时区的方式创建LocalDate对象,主要为了可以获得当前地区之外的时间,比如美国时间。ZoneId是可以获取到地球上所有地球的时区 -
Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();
常用方法
获取当前时间中的年月
| int year = now.getYear(); |
| int monthValue = now.getMonthValue(); |
| Month month = now.getMonth(); |
对于日的操作
| |
| int dayOfWeek = now.getDayOfWeek().getValue(); |
| |
| |
| int dayOfMonth = now.getDayOfMonth(); |
| |
| |
| int dayOfYear = now.getDayOfYear(); |
修改日期对象
| LocalDate now = LocalDate.now(); |
| |
| |
| LocalDate changYearDate = now.withYear(2025); |
| |
| |
| LocalDate cahngeMonthDate = now.withMonth(11); |
| |
| |
| LocalDate changeDayDate = now.withDayOfMonth(22); |
| |
| |
| LocalDate changeDayDate2 = now.withDayOfYear(200); |
| |
获取当前日期之后的日期
| LocalDate now = LocalDate.now(); |
| |
| |
| LocalDate plusYearDate = now.plusYears(2); |
| |
| |
| LocalDate plusMonthDate = now.plusMonths(2); |
| |
| |
| LocalDate plusWeekDate = now.plusWeeks(2); |
| |
| |
| LocalDate plusDayDate = now.plusDays(2); |
| |
| |
| LocalDate localDate = now.plusYears(2).plusMonths(2).plusWeeks(2).plusDays(2); |
| |
| |
| LocalDate with1 = LocalDate.now().with(new TemporalAdjuster() { |
| @Override |
| public Temporal adjustInto(Temporal temporal) { |
| LocalDate localDateTime1 = (LocalDate) temporal; |
| |
| DayOfWeek dayOfWeek1 = localDateTime1.getDayOfWeek(); |
| |
| if (dayOfWeek1.equals(DayOfWeek.FRIDAY)) { |
| return localDateTime1.plusDays(3); |
| } |
| if (dayOfWeek1.equals(DayOfWeek.SATURDAY)) { |
| return localDateTime1.plusDays(2); |
| } |
| return localDateTime1.plusDays(1); |
| } |
| }); |
单个日期的加法
| LocalDate now = LocalDate.now(); |
| |
| |
| LocalDate plusYearDate = now.plusYears(2); |
| |
| |
| LocalDate plusMonthDate = now.plusMonths(2); |
| |
| |
| LocalDate plusWeekDate = now.plusWeeks(2); |
| |
| |
| LocalDate plusDayDate = now.plusDays(2); |
| |
| LocalDate localDate = now.plusDays(1).plusWeeks(1).plusMonths(1).plusYears(1); |
单个日期的减法
| LocalDate now = LocalDate.now(); |
| |
| |
| LocalDate minusYearsDate = now.minusYears(1); |
| |
| |
| LocalDate minusMonthsDate = now.minusMonths(1); |
| |
| |
| LocalDate minusWeeksDate = now.minusWeeks(1); |
| |
| |
| LocalDate minusDaysDate = now.minusDays(1); |
| |
| LocalDate localDate = now.minusDays(1).minusWeeks(1).minusMonths(1).minusYears(1); |
两个日期的比较
| LocalDate parseDate = LocalDate.parse("2022-11-11"); |
| LocalDate parseDate2 = LocalDate.parse("2022-11-13"); |
| |
| |
| int i = parseDate.compareTo(parseDate2); |
| |
| |
| boolean before = parseDate.isBefore(parseDate2); |
| |
| |
| boolean after = parseDate.isAfter(parseDate2); |
| |
| |
| boolean equal = parseDate.isEqual(parseDate2); |
两个日期的隔间天数
| LocalDate startDate = LocalDate.parse("2021-09-01"); |
| |
| LocalDate endDate = LocalDate.parse("2021-10-20"); |
| |
| long betweenDays = ChronoUnit.DAYS.between(startDate, endDate); |
| |
| |
| LocalDate now = LocalDate.now(); |
| LocalDate of = LocalDate.of(2022, 1, 1); |
| Period between = Period.between(of1, now1); |
| |
| |
| int years = between.getYears(); |
| |
| |
| int months = between.getMonths(); |
| |
| |
| int days = between.getDays(); |
| |
获取两个日期之间的每一天
| LocalDate startDate = LocalDate.parse("2021-09-01"); |
| LocalDate endDate = LocalDate.parse("2021-10-20"); |
| |
| List<LocalDate> gapDays = new ArrayList<>(); |
| |
| long limit = ChronoUnit.DAYS.between(startDate, endDate) + 1; |
| for (LocalDate date = startDate; ; date = date.plusDays(1)) { |
| if (limit-- == 0) break; |
| gapDays.add(date); |
| } |
| System.out.println(gapDays) |
| |
| |
| gapDays.clear(); |
| Stream.iterate(endDate, d -> d.minusDays(1)).limit(ChronoUnit.DAYS.between(startDate, endDate) + 1).forEach(gapDays::add); |
| System.out.println(gapDays); |
与String类型互转
| |
| LocalDate tempToDay = LocalDate.now(); |
| |
| |
| System.out.println(tempToDay.toString()); |
| |
| |
| DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); |
| |
| System.out.println(tempToDay.format(df)); |
| |
| |
| |
| String str = "2021-12-01"; |
| DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd"); |
| LocalDate date = LocalDate.parse(str, format); |
| |
| System.out.println(date); |
LocalDateTime
- 一个不可变的时间日期时间对象,在对LocalDateTime对象进行
加减修改操
作后,返回的都是一个不可变的新日期时间对象
创建方式
| |
| LocalDateTime now = LocalDateTime.now(); |
| |
| |
| LocalDateTime of = LocalDateTime.of(2022, 11, 11, 11, 11, 11, 11); |
| |
| |
| LocalDateTime utcDateTime = LocalDateTime.now(Clock.systemUTC()); |
| |
| |
| LocalDateTime utc = LocalDateTime.now(ZoneId.of("UTC")); |
| LocalDateTime gmt = LocalDateTime.now(ZoneId.of("GMT")); |
| |
| |
| LocalDateTime beijing = LocalDateTime.now(ZoneId.of("GMT+8")); |
| |
| |
| LocalDateTime localDateTime = LocalDateTime.of(LocalDate.of(2012,12,2),LocalTime.of(12,45)) |
常用方法
获取时间中的年,月,日,时,分,秒
| LocalDateTime now = LocalDateTime.now(); |
| |
| |
| int year = now.getYear(); |
| |
| |
| int monthValue = now.getMonthValue(); |
| |
| |
| int dayOfMonth = now.getDayOfMonth(); |
| |
| |
| int dayOfYear = now.getDayOfYear(); |
| |
| |
| int dayOfWeek = now.getDayOfWeek().getValue(); |
| |
| |
| int hour = now.getHour(); |
| |
| |
| int minute = now.getMinute(); |
| |
| |
| int second = now.getSecond(); |
| |
| int nano = now.getNano(); |
单个时间的加法
| LocalDateTime now = LocalDateTime.now(); |
| |
| |
| LocalDateTime localDateTime = now.plusYears(1L); |
| |
| LocalDateTime localDateTime1 = now.plusMonths(1L); |
| |
| LocalDateTime localDateTime2 = now.plusDays(1L); |
| |
| LocalDateTime localDateTime4 = now.plusWeeks(1L); |
| |
| LocalDateTime localDateTime3 = now.plusHours(1L); |
| |
| LocalDateTime localDateTime5 = now.plusMinutes(1L); |
| |
| LocalDateTime localDateTime6 = now.plusSeconds(1L); |
| |
| LocalDateTime localDateTime7 = now.plusNanos(1L); |
| |
| LocalDateTime localDateTime8 = now.plusYears(1L).plusMonths(1L).plusWeeks(1L).plusDays(1L).plusHours(1L).plusMinutes(1L).plusSeconds(1L).plusNanos(1L); |
单个时间的减法
| LocalDateTime now = LocalDateTime.now(); |
| |
| LocalDateTime localDateTime = now.minusYears(1L); |
| LocalDateTime localDateTime1 = now.minusMonths(1L); |
| LocalDateTime localDateTime2 = now.minusDays(1L); |
| LocalDateTime localDateTime4 = now.minusWeeks(1L); |
| LocalDateTime localDateTime3 = now.minusHours(1L); |
| LocalDateTime localDateTime5 = now.minusMinutes(1L); |
| LocalDateTime localDateTime6 = now.minusSeconds(1L); |
| LocalDateTime localDateTime7 = now.minusNanos(1L); |
| |
| LocalDateTime localDateTime8 = now.minusYears(1L).minusMonths(1L).minusWeeks(1L).minusDays(1L).minusHours(1L).minusMinutes(1L).minusSeconds(1L).minusNanos(1L); |
时间的修改
| LocalDateTime changeBeforeTime = LocalDateTime.now(); |
| |
| LocalDateTime localDateTime = changeBeforeTime.withYear(2024); |
| |
| LocalDateTime localDateTime5 = changeBeforeTime.withMonth(1); |
| |
| LocalDateTime localDateTime4 = changeBeforeTime.withDayOfMonth(1); |
| LocalDateTime localDateTime3 = changeBeforeTime.withDayOfYear(1); |
| |
| LocalDateTime localDateTime2 = changeBeforeTime.withHour(1); |
| |
| LocalDateTime localDateTime1 = changeBeforeTime.withMinute(10).withSecond(10); |
| |
| |
| |
| LocalDateTime with = LocalDateTime.now().with(TemporalAdjusters.next(DayOfWeek.THURSDAY)); |
| |
| |
| LocalDateTime with1 = LocalDateTime.now().with(new TemporalAdjuster() { |
| @Override |
| public Temporal adjustInto(Temporal temporal) { |
| LocalDateTime localDateTime1 = (LocalDateTime) temporal; |
| |
| DayOfWeek dayOfWeek1 = localDateTime1.getDayOfWeek(); |
| |
| if (dayOfWeek1.equals(DayOfWeek.FRIDAY)) { |
| return localDateTime1.plusDays(3); |
| } |
| if (dayOfWeek1.equals(DayOfWeek.SATURDAY)) { |
| return localDateTime1.plusDays(2); |
| } |
| return localDateTime1.plusDays(1); |
| } |
| }); |
| |
两个时间的比较
| LocalDateTime tempTime1 = LocalDateTime.of(2022, 1, 1, 1, 1,1); |
| LocalDateTime tempTime2 = LocalDateTime.of(2023, 1, 1, 1, 1,1); |
| |
| boolean after = tempTime1.isAfter(tempTime2); |
| |
| boolean before = tempTime1.isBefore(tempTime2); |
| |
| boolean equal = tempTime1.isEqual(tempTime2); |
ChronoUnit.单位.between的方式获取相差时间差
| LocalDateTime beginTime = LocalDateTime.of(2021, 7, 6, 11, 36,25); |
| LocalDateTime endTime = LocalDateTime.of(2021, 9, 8, 01, 56,25); |
| |
| long betweenYears = ChronoUnit.YEARS.between(beginTime, endTime); |
| System.out.println(betweenYears); |
| |
| long betweenMonths = ChronoUnit.MONTHS.between(beginTime, endTime); |
| System.out.println(betweenMonths); |
| |
| long betweenDays = ChronoUnit.DAYS.between(beginTime, endTime); |
| System.out.println(betweenDays); |
| |
| long betweenHours = ChronoUnit.HOURS.between(beginTime, endTime); |
| System.out.println(betweenHours); |
| |
| long betweenMinutes = ChronoUnit.MINUTES.between(beginTime, endTime); |
| System.out.println(betweenMinutes); |
| |
| long betweenMillis = ChronoUnit.MILLIS.between(beginTime, endTime); |
| System.out.println(betweenMillis); |
Duration类的between方法获取时间差
- 此方法获取不到相差的年月;但是获取到的Duration对象提供了天,时,分,秒,转换,只要获取到了就可以用其转成自己想要的单位;
| LocalDateTime beginTime = LocalDateTime.of(2021, 7, 6, 11, 36,25); |
| LocalDateTime endTime = LocalDateTime.of(2021, 9, 8, 01, 56,25); |
| |
| Duration between1 = Duration.between(beginTime, endTime); |
| |
| System.out.println(between1.toDays()); |
| System.out.println(between1.toHours()); |
| System.out.println(between1.toMinutes()); |
| System.out.println(between1.toMillis()); |
LocalDateTime转为LocalDate
| LocalDateTime now = LocalDateTime.now(); |
| LocalDate localDate = now.toLocalDate(); |
LocalDateTime转为LocalTime
| LocalDateTime now = LocalDateTime.now(); |
| LocalTime localDate = now.toLocalTime(); |
LocalDateTime与String的互转
| |
| |
| |
| |
| String ISOLocalDateTime = LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME); |
| |
| |
| String dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now()); |
| String localDateTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); |
| |
| |
| LocalDateTime localDateTime1 = LocalDateTime.parse("2012-12-11 08:05:15", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); |
| |
| LocalDateTime localDateTime2 = LocalDateTime.parse("2012-12-11T08:05:15", DateTimeFormatter.ISO_LOCAL_DATE_TIME); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2022-03-03 DBeaver导入SQL脚本数据