LocalDateTime与LocalDate
时间新特性
- 新生事物出现,必定是对旧事物的完善或者是缺陷的弥补。
- 本文章介绍LocalDate、LocalDateTime。在多线程的情况,相比较于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();
这个
Month
是Java
对月份抽象化后的对象,本身包含了一些方法,更多方法自行查看// 获取与本季度的第一个月对应的月份
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的更多相关文章
- Java 8 中 Date与LocalDateTime、LocalDate、LocalTime互转
Java 8中 java.util.Date 类新增了两个方法,分别是from(Instant instant)和toInstant()方法 // Obtains an instance of Dat ...
- LocalDateTime、LocalDate、Long、Date、String 相互转换
DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); ...
- Java中String、LocalDateTime、LocalDate、Date互转
String 转LocalDate和LocalDateTime LocalDate startDate = LocalDate.parse("2019-12-05", DateTi ...
- java 8时间使用LocalDateTime,ZonedDateTime,LocalDate
前言 java 8的时间已经能够满足日常的使用,也方便理解.joda-time作为一个有优秀的时间组件也不得不告知使用者在java 8以后使用自带的时间 LocalDateTime以及ZonedDat ...
- 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 ...
- LocalDate、LocalDateTime、LocalTime开发小结
在我之前的文章<[整理]Java 8新特性总结 >中有提到Date/Time API (JSR 310)对日期与时间的处理.它将服务端对时间的处理进行了统一,使得对时间的处理更加规范和统一 ...
- LocalDateTime与字符串互转/Date互转/LocalDate互转/指定日期/时间比较
Java 8中表示日期和时间的类有多个,主要的有: Instant:表示时刻,不直接对应年月日信息,需要通过时区转换 LocalDateTime: 表示与时区无关的日期和时间信息,不直接对应时刻,需要 ...
- LocalDate/LocalDateTime/LocalTime与Date的互转
// 01. java.util.Date --> java.time.LocalDateTime public void UDateToLocalDateTime() { java.util. ...
- LocalDate LocalTime LocalDateTime Instant的操作与使用
一.简介 LocalDate表示当前(或指定)日期,格式为:yyyy-MM-dd LocalTime表示当前(或指定)时间,格式为:HH:mm:ss SSS LocalDateTime表示当前(或指定 ...
- java8新特性LocalDate、LocalTime、LocalDateTime的学习
以前操作时间都是使用SimpleDateFormat类改变Date的时间格式,使用Calendar类操作时间.但是SimpleDateFormat是线程不安全的,源码如下: private Strin ...
随机推荐
- CCRD_TOC_2015_EULAR专刊第二辑
中信国健风湿免疫临床通讯 EULAR2015专刊第2辑●目录 类风湿关节炎专题 ■ RA放射学进展的预测 OP0070 滑膜HIF-1a与RA关节破坏 THU0085 24周SDAI缓解能否预测R ...
- 01#Web 实战:雷达图
成品演示 绘制雷达图 雷达图里外层 function calcPolygonX(radarX, radius, increaseAngle) { return radarX + radius * Ma ...
- Vue学习笔记之Vue基础语法
1. 概述 Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据.所有 Vue.js 的模板都是合法的 HTML,所以能被遵循规范的浏览器和 H ...
- HTML+css图片轮播
<div class="pst"> <div class="pin"> <div style="background-i ...
- 单兵 Web 快速开发框架!
Jmix 是低代码? 自从 Jmix 2018 年在中国推广以来(那时叫 CUBA 平台),很多开发者会在使用之前询问我们,Jmix 是不是低代码,扩展性怎么样? 低代码应用程序平台(LCAP)是当今 ...
- 自定义view,用来测试屏幕
public class BezierGestureTrackView extends View { private Bitmap mBufferBitmap; private Canvas mBuf ...
- kubernetes service服务发现两种方式
service服务发现ClusterIP方式 1.暴露deployment服务 kubectl expose deployment nginx4 --port=8000 --target-port=8 ...
- java短链接生成二维码
import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxi ...
- Veeva_001常见问题总结
1.时间互动轴:其他代表与该医生的互动记录 2.Call的拜访流程 : 用户在Ipad端先制定计划拜访(已计划:青色)后,需手动同步到服务器上: 进入拜访详细,选择联系人和产品及相关拜访信息等,并'保 ...
- tensorrt cuda cudnn 各版本的匹配要求
https://docs.nvidia.com/deeplearning/tensorrt/release-notes/tensorrt-8.html#rel_8-0-3