Java LocalDate类使用总结
一、背景分析
Java中1.8之前涉及到时间的定义或者计算,我们常使用Date和Calendar类来完成。
1、Date类到了1.8大部分的方法被弃用了,而且date格式可读性特别差,我们往往需要去格式化,而格式化使用simpledateformat来进行操作线程不安全,simpledateformat方法中format和parse方法都是线程不安全的。
2、Calendar类是一个共享变量,多个线程会同时调用calendar.setTime方法也会导致时间一直被修改从而返回错误的时间。
基于这些安全问题的考虑,Java1.8之后出现了localdate,localdatetime,localtime类,而这些类使用了final来修饰,使得这些类是不可变的,一旦实例化,值就固定了,这些类都是线程安全的。
二、功能介绍
1、区别 :localdate是针对于年月日的,localtime是针对于时分秒,localdatetime是针对于年月日时分秒
2、初始化:
/**
* 获取当前时间
*/
@Test
public void localDateCreate() {
LocalDate yyyyMMdd = LocalDate.now();
LocalTime HHmmssSSS = LocalTime.now();
LocalDateTime yyyyMMddHHmmssSSS = LocalDateTime.now();
System.out.println("年月日: " + yyyyMMdd);
System.out.println("时分秒毫秒: " + HHmmssSSS);
System.out.println("年月日时分秒毫秒: " + yyyyMMddHHmmssSSS);
//输出:
// 年月日: 2020-10-16
// 时分秒毫秒: 09:55:49.448
// 年月日时分秒毫秒: 2020-10-16T09:55:49.448
}
3、自定义:
/**
* localDate 设值自定义日期
* 根据指定日期/时间创建对象
*/
@Test
public void setDate() {
LocalDate yyyyMMdd = LocalDate.of(2020, 10, 15); //2020-10-15
LocalTime HHmmssSSS = LocalTime.of(10, 10, 10); //10:10:10
LocalDateTime yyyyMMddHHmmssSSS = LocalDateTime.of(2020, 10, 15, 10, 10); //2020-10-15T10:10
LocalDate directDesignationYear = yyyyMMdd.withYear(2000);
System.out.println("LocalDate 指定年份: " + directDesignationYear);
LocalDate directDesignationMonth = yyyyMMdd.withMonth(6);
System.out.println("LocalDate 指定月份: " + directDesignationMonth);
LocalDate directDesignationYearDate = yyyyMMdd.withDayOfYear(20);
System.out.println("LocalDate 指定到当年第几天: " + directDesignationYearDate);
LocalDate directDesignationDate = yyyyMMdd.withDayOfMonth(20);
System.out.println("LocalDate 指定到当月几号: " + directDesignationDate);
}
4、计算:
/**
* 日期时间的加减
*/
@Test
public void lessOrAddDate() {
LocalDate yyyyMMdd = LocalDate.now();
LocalDate addOneDay = yyyyMMdd.plusDays(1L); //添加一日
LocalDate addOneMonths = yyyyMMdd.plusMonths(1L);//添加一月
LocalDate addOneYears = yyyyMMdd.plusYears(1L);//添加一年
LocalDate addOneWeeks = yyyyMMdd.plusWeeks(1L);//添加一周
LocalDate delOneDay = yyyyMMdd.minusDays(1L); //减去一日
LocalDate delOneMonths = yyyyMMdd.minusMonths(1L);//减去一月
LocalDate delOneYears = yyyyMMdd.minusYears(1L);//减去一年
LocalDate delOneWeeks = yyyyMMdd.minusWeeks(1L);//减去一周
-------------------------------------------------------------
LocalTime HHmmssSSS = LocalTime.now();
LocalTime addOneHours = HHmmssSSS.plusHours(1L); //添加1小时
LocalTime addOneMinutes = HHmmssSSS.plusMinutes(1L);//添加1分钟
LocalTime addOneSeconds = HHmmssSSS.plusSeconds(1L);//添加1秒
LocalTime addOneNanos = HHmmssSSS.plusNanos(1L);//添加1纳秒
LocalTime delOneHours = HHmmssSSS.minusHours(1L); //减去1小时
LocalTime delOneMinutes = HHmmssSSS.minusMinutes(1L);//减去1分钟
LocalTime delOneSeconds = HHmmssSSS.minusSeconds(1L);//减去1秒
LocalTime delOneNanos = HHmmssSSS.minusNanos(1L);//减去1纳秒
-------------------------------------------------------------
LocalDateTime yyyyMMddHHmmssSSS = LocalDateTime.now();
LocalDateTime localDateTimeaddOneDay = yyyyMMddHHmmssSSS.plusDays(1L); //添加一日
LocalDateTime localDateTimeaddOneMonths = yyyyMMddHHmmssSSS.plusMonths(1L);//添加一月
LocalDateTime localDateTimeaddOneYears = yyyyMMddHHmmssSSS.plusYears(1L);//添加一年
LocalDateTime localDateTimeaddOneWeeks = yyyyMMddHHmmssSSS.plusWeeks(1L);//添加一周
LocalDateTime localDateTimeaddOneHours = yyyyMMddHHmmssSSS.plusHours(1L); //添加1小时
LocalDateTime localDateTimeaddOneMinutes =yyyyMMddHHmmssSSS.plusMinutes(1L);//添加1分钟
LocalDateTime localDateTimeaddOneSeconds = yyyyMMddHHmmssSSS.plusSeconds(1L);//添加1秒
LocalDateTime localDateTimeaddOneNanos = yyyyMMddHHmmssSSS.plusNanos(1L);//添加1纳秒
LocalDateTime localDateTimedelOneDay = yyyyMMddHHmmssSSS.minusDays(1L); //减去一日
LocalDateTime localDateTimedelOneMonths = yyyyMMddHHmmssSSS.minusMonths(1L);//减去一月
LocalDateTime localDateTimedelOneYears = yyyyMMddHHmmssSSS.minusYears(1L);//减去一年
LocalDateTime localDateTimedelOneWeeks = yyyyMMddHHmmssSSS.minusWeeks(1L);//减去一周
LocalDateTime localDateTimedelOneHours = yyyyMMddHHmmssSSS.minusHours(1L); //减去1小时
LocalDateTime localDateTimedelOneMinutes=yyyyMMddHHmmssSSS.minusMinutes(1L);//减去1分钟
LocalDateTime localDateTimedelOneSeconds = yyyyMMddHHmmssSSS.minusSeconds(1L);//减去1秒
LocalDateTime localDateTimedelOneNanos = yyyyMMddHHmmssSSS.minusNanos(1L);//减去1纳秒
}
5、获取日期的年月日周时分秒:
public void getDateInfo() {
LocalDateTime yyyyMMddHHmmssSSS = LocalDateTime.now();
//本年当中第多少天
int dayOfYear = yyyyMMddHHmmssSSS.getDayOfYear();//310
//本月当中第多少天
int dayOfMonth = yyyyMMddHHmmssSSS.getDayOfMonth();//5
//英文
DayOfWeek dayOfWeek = yyyyMMddHHmmssSSS.getDayOfWeek();//TUESDAY
//本周中星期几
int value = dayOfWeek.getValue();//2
//今天是2024-11-05T10:33:41.955
//本年当中第310天
//本月当中第5天
//本周中星期2-即TUESDAY
//年
int year = yyyyMMddHHmmssSSS.getYear();
//月
Month month = yyyyMMddHHmmssSSS.getMonth();
//或直接获取
int monthValue = yyyyMMddHHmmssSSS.getMonthValue();
//日
int dayOfMonth1 = yyyyMMddHHmmssSSS.getDayOfMonth();
//时
int hour = yyyyMMddHHmmssSSS.getHour();
//分
int minute = yyyyMMddHHmmssSSS.getMinute();
//秒
int second = yyyyMMddHHmmssSSS.getSecond();
//纳秒
int nano = yyyyMMddHHmmssSSS.getNano();
}
6、时间的比较与判断:
public void compare() {
LocalDate now = LocalDate.now();
LocalDate of = LocalDate.of(2020, 10, 15);
//判断of 是否在 now 时间之前
boolean before = of.isBefore(now);//true
//判断of 是否在 now 时间之后
boolean after = of.isAfter(now);//false
//判断两个时间是否相等
boolean equal = of.isEqual(now);//false
//判断是否为闰年
boolean leapYear = now.isLeapYear();//false
}
7、计算时间、日期间隔:
public void durationOrPeriod() {
LocalDateTime now = LocalDateTime.now();
LocalDateTime of = LocalDateTime.of(2020, 10, 15, 10, 24);
//Duration:用于计算两个“时间”间隔
Duration duration = Duration.between(now, of);
System.out.println(now + " 与 " + of + " 间隔 " + "\n"
+ " 天 :" + duration.toDays() + "\n"
+ " 时 :" + duration.toHours() + "\n"
+ " 分 :" + duration.toMinutes() + "\n"
+ " 毫秒 :" + duration.toMillis() + "\n"
+ " 纳秒 :" + duration.toNanos() + "\n"
);
//Period:用于计算两个“日期”间隔
Period period = Period.between(nowDate, OfDate);
System.out.println("Period相差年数 : " + period.getYears());
System.out.println("Period相差月数 : " + period.getMonths());
System.out.println("Period相差日数 : " + period.getDays());
//还可以这样获取相差的年月日
System.out.println("-------------------------------");
long years = period.get(ChronoUnit.YEARS);
long months = period.get(ChronoUnit.MONTHS);
long days = period.get(ChronoUnit.DAYS);
System.out.println("Period相差的年月日分别为 : " + years + "," + months + "," + days);
//注意,当获取两个日期的间隔时,并不是单纯的年月日对应的数字相加减,而是会先算出具体差多少天,在折算成相差几年几月几日的
}
8、日期格式化:
@Test
public void formatter1() {
//将时间对象转化为日期字符串
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS");
String format = dtf.format(now);
System.out.println(format);
//输出: 2020-10-16 14:41:01:086
//字符串对象转为格式化后的时间日期对象
String dateStr = "2020-11-12";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate formatterDate = LocalDate.parse(dateStr, dtf);
System.out.println(formatterDate);
//输出 2020-11-12
}
9、日期之间的转换:
/**
* localDate 转 date
* localDateTime 转 date
*/
@Test
public void localDateToDate() {
//localDate 转 date
LocalDate now = LocalDate.now();
Date from = Date.from(now.atStartOfDay(ZoneOffset.systemDefault()).toInstant());
//localDateTime 转 date
LocalDateTime localDateTime = LocalDateTime.now();
Date date = Date.from(localDateTime.atZone(ZoneOffset.ofHours(8)).toInstant());
//date 转 localDate
Date date = new Date();
LocalDate localDate =date.toInstant().atZone(ZoneOffset.systemDefault()).toLocalDate();
//date 转 localDateTime
LocalDateTime localDateTime = date.toInstant().atZone(ZoneOffset.systemDefault()).toLocalDateTime();
//LocalDate 转 时间戳
LocalDate localDate = LocalDate.now();
long instant = localDate.atStartOfDay(ZoneOffset.systemDefault()).toInstant().toEpochMilli();
//LocalDateTime 转 时间戳
LocalDateTime now = LocalDateTime.now();
long instant1 = now.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
//时间戳 转 LocalDate
long time = new Date().getTime();
LocalDateTime localDateTime = Instant.ofEpochMilli(time).atZone(ZoneOffset.systemDefault()).toLocalDateTime();
//时间戳 转 LocalDateTime
LocalDate localDate = Instant.ofEpochMilli(time).atZone(ZoneOffset.systemDefault()).toLocalDate();
}