LocalDateTime与LocalDate

时间新特性

  • 新生事物出现,必定是对旧事物的完善或者是缺陷的弥补。
  • 本文章介绍LocalDateLocalDateTime。在多线程的情况,相比较于Date、Calendar、SimpleDateFormat或DateFormat下的其他子类而言。这些类都是线程安全且性能更好,代码更加简洁

LocalDate

  • 一个不可变的时间日期对象,表示日期,表现为年月日(2010-10-10),在对LocalDate对象进行 加减修改操 作后,返回的都是一个不可变的新日期对象
创建方式
// 获取当前日期
LocalDate now = LocalDate.now();

// 指定日期获取LocalDate对象
LocalDate of = LocalDate.of(2022, 1, 1);

// 以固定格式的字符串获取LocalDate对象
LocalDate start = LocalDate.parse("2023-03-01");
// 指定时区创建LocalDate对象
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();
  • 这个MonthJava对月份抽象化后的对象,本身包含了一些方法,更多方法自行查看

    • // 获取与本季度的第一个月对应的月份
       int month1 = month.firstMonthOfQuarter().getValue();
      
    • // 本月最少天数
      int i1 = month.minLength();
      

对于日的操作
// 今天星期几? 如果这里不用getValue方法,返回的是DayOfWeek对象
int dayOfWeek = now.getDayOfWeek().getValue();

// 今天在本月当中是第几天
int dayOfMonth = now.getDayOfMonth();

// 今天在今年当中是第多少天
int dayOfYear = now.getDayOfYear();
修改日期对象
LocalDate now = LocalDate.now();

// 修改日期的年份
LocalDate changYearDate = now.withYear(2025); // 2025-12-18

// 修改日期的月份
LocalDate cahngeMonthDate = now.withMonth(11); // 2021-11-18

// 修改日期在当月的天数
LocalDate changeDayDate = now.withDayOfMonth(22); //2021-12-22

// 修改日期在当年的天数
LocalDate changeDayDate2 = now.withDayOfYear(200); //2021-07-1

获取当前日期之后的日期
  • 比如说几年后,几个月后,几天后
LocalDate now = LocalDate.now();

// 获取当前日期增加指定年份-2年后的日期
LocalDate plusYearDate = now.plusYears(2);

// 获取当前日期增加指定月份-2月后的日期
LocalDate plusMonthDate = now.plusMonths(2); 

// 获取当前日期增加指定星期(2周)后的日期
LocalDate plusWeekDate = now.plusWeeks(2); 

// 获取当前日期增加指定天数-2天后的日期
LocalDate plusDayDate = now.plusDays(2);

// 获取当前时间 2年2月2周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();

 // 获取当前日期增加指定年份-2年后的日期
LocalDate plusYearDate = now.plusYears(2);

// 获取当前日期增加指定月份-2月后的日期
LocalDate plusMonthDate = now.plusMonths(2);

// 获取当前日期增加指定星期(2周)后的日期
LocalDate plusWeekDate = now.plusWeeks(2); 

// 获取当前日期增加指定天数-2天后的日期
LocalDate plusDayDate = now.plusDays(2);

LocalDate localDate = now.plusDays(1).plusWeeks(1).plusMonths(1).plusYears(1);
单个日期的减法
LocalDate now = LocalDate.now();

//获取 1 年前的时间
LocalDate minusYearsDate = now.minusYears(1);

// 获取 1 月前的时间
LocalDate minusMonthsDate = now.minusMonths(1);

// 获取 1 周前的时间
LocalDate minusWeeksDate = now.minusWeeks(1);

// 获取 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");

//compareTo(ChronoLocalDate other) int 比较当前对象和other对象在时间上的大小,返回值如果为正,则当前时间较晚
int i = parseDate.compareTo(parseDate2); // -2

// isBefore(ChronoLocalDate other) boolean 比较当前对象日期是否在other对象之前
boolean before = parseDate.isBefore(parseDate2); // true

// isAfter(ChronoLocalDate other) boolean 比较当前对象日期是否在other对象之后
boolean after = parseDate.isAfter(parseDate2); // false

// isEqual(ChronoLocalDate other) boolean 比较两个日期对象是否相等
boolean equal = parseDate.isEqual(parseDate2); //false
两个日期的隔间天数
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<>();
// 7.1 利用plusDays获取,第一种写法是for循环,比较清晰好看
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)
     
//7.2 利用minusDays获取
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转String
LocalDate tempToDay = LocalDate.now();

// 直接利用LocalDate重写后的toString方法
System.out.println(tempToDay.toString());  // 2021-12-20

// 利用DateTimeFormatter类按模板转化
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
// 2021-12-20
System.out.println(tempToDay.format(df)); 


//>>> String转LocalDate
String str = "2021-12-01";
DateTimeFormatter format  = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate date = LocalDate.parse(str, format);
// 2020-01-01
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());
	
// GMT是前世界标准时,UTC是现世界标准时。UTC 比 GMT更精准,以原子时计时,适应现代社会的精确计时。
LocalDateTime utc = LocalDateTime.now(ZoneId.of("UTC"));
LocalDateTime gmt = LocalDateTime.now(ZoneId.of("GMT"));

//  东八区的时间
LocalDateTime beijing = LocalDateTime.now(ZoneId.of("GMT+8"));

// 指定日期时间-of,分别用LocalDate和DateTime解析生成LocalDateTime,of方法的传参方式有很多,有需要的自己看源码
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();

// 今天星期几.同样的,去掉getValue()方法后会得到Java抽象对象-周
int dayOfWeek = now.getDayOfWeek().getValue();

// 小时
int hour = now.getHour();

// 分钟
int minute = now.getMinute();

// 秒
int second = now.getSecond();
// 毫秒
int nano = now.getNano();
  • 在获取月份时,改为调用 of.getMonth()方法,会得到月份对象,在介绍LocalDate时已经介绍过了,在这里就不再做介绍

     Month month = now.getMonth();
    
单个时间的加法
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);

//>>> 时间矫正器 TemporalAdjusters
// 获取下一个周四是多少号
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);
// 判断tempTime1是否在tempTime2之后,是否比其更晚
boolean after = tempTime1.isAfter(tempTime2); // false
// 判断tempTime1是否在tempTime2之前,是否比其更早
boolean before = tempTime1.isBefore(tempTime2); //true
// 判断tempTime1是否与tempTime2相等
boolean equal = tempTime1.isEqual(tempTime2); // false
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);  // 0
// 相差的月份数
long betweenMonths = ChronoUnit.MONTHS.between(beginTime, endTime);
System.out.println(betweenMonths);  // 2
// 相差的天数
long betweenDays = ChronoUnit.DAYS.between(beginTime, endTime);
System.out.println(betweenDays);  // 63
// 相差的小时数
long betweenHours = ChronoUnit.HOURS.between(beginTime, endTime);
System.out.println(betweenHours); //1526
// 相差的分钟数
long betweenMinutes = ChronoUnit.MINUTES.between(beginTime, endTime);
System.out.println(betweenMinutes);//91580
// 相差的秒钟数
long betweenMillis = ChronoUnit.MILLIS.between(beginTime, endTime);
System.out.println(betweenMillis);//91580
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()); // 63 
System.out.println(between1.toHours()); //1526 (63天*24小时+(24+1-11)不是整天的小时数)
System.out.println(between1.toMinutes()); // 91580 (1526小时*60分钟+(56-25)分钟外相差的秒数)
System.out.println(between1.toMillis()); // 5494800000
LocalDateTime转为LocalDate
LocalDateTime now = LocalDateTime.now();
LocalDate localDate = now.toLocalDate();
LocalDateTime转为LocalTime
LocalDateTime now = LocalDateTime.now();
LocalTime localDate = now.toLocalTime();

LocalDateTime与String的互转
        /**
         * java中DateTimeFormatter类提供了很多日期格式。类似ISO_LOCAL_DATE等来做格式转化,但是结果都不是我们普遍所用的
         * ISOLocalDateTime : 2023-03-03T10:36:08.72
         */
        String ISOLocalDateTime = LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);

        // LocalDateTime转String
        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"));

        // String转LocalDateTime
        LocalDateTime localDateTime1 = LocalDateTime.parse("2012-12-11 08:05:15", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        // 如果时间格式带有T的
        LocalDateTime localDateTime2 = LocalDateTime.parse("2012-12-11T08:05:15", DateTimeFormatter.ISO_LOCAL_DATE_TIME);
posted @ 2023-03-03 11:06  unknown-n2  阅读(158)  评论(0编辑  收藏  举报