时间新特性

  • 新生事物出现,必定是对旧事物的完善或者是缺陷的弥补。
  • 本文章介绍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);

LocalDateTime与LocalDate的更多相关文章

  1. Java 8 中 Date与LocalDateTime、LocalDate、LocalTime互转

    Java 8中 java.util.Date 类新增了两个方法,分别是from(Instant instant)和toInstant()方法 // Obtains an instance of Dat ...

  2. LocalDateTime、LocalDate、Long、Date、String 相互转换

    DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); ...

  3. Java中String、LocalDateTime、LocalDate、Date互转

    String 转LocalDate和LocalDateTime LocalDate startDate = LocalDate.parse("2019-12-05", DateTi ...

  4. java 8时间使用LocalDateTime,ZonedDateTime,LocalDate

    前言 java 8的时间已经能够满足日常的使用,也方便理解.joda-time作为一个有优秀的时间组件也不得不告知使用者在java 8以后使用自带的时间 LocalDateTime以及ZonedDat ...

  5. Java 8 Date Time API Example Tutorial – LocalDate, Instant, LocalDateTime, Parse and Format

    参考 Java 8 Date and Time API is one of the most sought after change for developers. Java has been mis ...

  6. LocalDate、LocalDateTime、LocalTime开发小结

    在我之前的文章<[整理]Java 8新特性总结 >中有提到Date/Time API (JSR 310)对日期与时间的处理.它将服务端对时间的处理进行了统一,使得对时间的处理更加规范和统一 ...

  7. LocalDateTime与字符串互转/Date互转/LocalDate互转/指定日期/时间比较

    Java 8中表示日期和时间的类有多个,主要的有: Instant:表示时刻,不直接对应年月日信息,需要通过时区转换 LocalDateTime: 表示与时区无关的日期和时间信息,不直接对应时刻,需要 ...

  8. LocalDate/LocalDateTime/LocalTime与Date的互转

    // 01. java.util.Date --> java.time.LocalDateTime public void UDateToLocalDateTime() { java.util. ...

  9. LocalDate LocalTime LocalDateTime Instant的操作与使用

    一.简介 LocalDate表示当前(或指定)日期,格式为:yyyy-MM-dd LocalTime表示当前(或指定)时间,格式为:HH:mm:ss SSS LocalDateTime表示当前(或指定 ...

  10. java8新特性LocalDate、LocalTime、LocalDateTime的学习

    以前操作时间都是使用SimpleDateFormat类改变Date的时间格式,使用Calendar类操作时间.但是SimpleDateFormat是线程不安全的,源码如下: private Strin ...

随机推荐

  1. Nacos服务调用(基于Openfeign)

    在<<Nacos服务注册>>这篇文章里,我搭建了一个nacos服务中心,并且注册了一个服务,下面我们来看在上一篇文章的基础上,怎样用Openfeign来调用这个服务. 0.同上 ...

  2. Leaflet 调用腾讯瓦片地图服务demo

    <link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" ...

  3. 实现 JSON 高亮

    JSON 转换 HTML function formatJson(json) { let regexp = /("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"]) ...

  4. 可以编译驱动,编译ch34x驱动后,不能编译驱动了

    编译驱动时,得先把内核编译好: 已经成功编译了01驱动: 后来编译ch34x驱动,发现编译不成功: 然后再编译01驱动也不成功了: 再次编译内核,再编译01就能编译了: 能力有限,不知道为什么,记录下 ...

  5. sentry-sdk 使用

    一.代码 import os import random import logging import sentry_sdk from sentry_sdk.tracing import Transac ...

  6. windows 10 更新代理

    安装 Windows 更新 Windows 更新扫描.下载.安装,每一部分都采用独立的服务. Windows 更新客户端利用 Windows HTTP 服务(WinHTTP)扫描可用更新: Backg ...

  7. lg7335 [JRKSJ R1] 异或 题解

    本题的标签中含有trie,但是这道题可以不用trie做. 考虑列出本题的dp方程:设\(f_{k,i}\)表示前\(i\)个数选了\(k\)段的答案,\(s_i\)为数组的前缀异或和 当不选择第\(i ...

  8. elasticsearch8.6.1安装后无法打开127.0.0.1:9200的解决办法

    解决办法 确保java版本在11及以上 补充: 去除密码 给elasticsearch.yml添加一条配置 xpack.security.enabled: false

  9. ShareWAF 软件&云形态安装部署说明

    一.常用文件说明sharewaf.js:主程序daemon.js:主程序守护程序oem.js:OEM 定制文件developer.js:二次开发接口rules.js:自定义规则文件regexp.js: ...

  10. iOS中的三种定时器

    iOS中的三种定时器 NSTimer 一.背景 定时器是iOS开发中经常使用的,但是使用不慎会造成内存泄露,因为NSTimer没有释放,控制器析构函数dealloc也没有调用,造成内存泄露. 二.使用 ...