日期时间类
- 概述:LocalDate、 LocalTime、 LocalDateTime类的实例是不可变的对象,分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。
它们提供了简单的日期或时间,并不包含当前的时间信息,也不包含与时区相关的信息
注: ISO-8601日历系统是国际标准化组织制定的现代公民的日期和时间的表示法
这些新增的日期时间API都在 java.time包下 - 获取对象的方法
(1)通过静态方法now
(2)通过静态方法of,且参数可以指定年月日时分秒
package org.westos3.demo;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class MyTest2 {
public static void main(String[] args) {
//获取当前的年月日
LocalDate now = LocalDate.now();
System.out.println(now);
//获取当前的时分秒
//通过LocalTime获取时分秒时,秒精确到毫秒
LocalTime now1 = LocalTime.now();
System.out.println(now1);
//获取当前的年月日时分秒
LocalDateTime now2 = LocalDateTime.now();
System.out.println(now2);
System.out.println("------------------------");
//指定年月日
LocalDate of = LocalDate.of(2019, 11, 19);
System.out.println(of);
//指定时分秒
LocalTime of1 = LocalTime.of(18, 45, 55);
System.out.println(of1);
//指定年月日时分秒
LocalDateTime of2 = LocalDateTime.of(2019, 11, 19, 18, 45, 55);
System.out.println(of2);
}
}
- 格式化日期
package org.westos3.demo;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
public class MyTest2 {
public static void main(String[] args) {
//之前格式化日期做法
String format = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒").format(new Date());
System.out.println(format);
System.out.println("---------------------");
//LocalDateTime类格式化日期
LocalDateTime now = LocalDateTime.now();
//调用format方法格式化日期
String str = now.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒"));
System.out.println(str);
}
}
- 与获取相关的方法
package org.westos3.demo;
import java.time.LocalDateTime;
public class MyTest2 {
public static void main(String[] args) {
//获取对象
LocalDateTime now = LocalDateTime.now();
//获取年份
int year = now.getYear();
System.out.println(year);
//获取月份
int monthValue = now.getMonthValue();
System.out.println(monthValue);
//获取天份
int dayOfMonth = now.getDayOfMonth();
System.out.println(dayOfMonth);
}
}
获取方法除了获得年月份之外,还有其他的一些获取方法
根据方法名,就可以知道获取的是什么
- 与转换相关的方法
package org.westos3.demo;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class MyTest2 {
public static void main(String[] args) {
//获取年月日时分秒
LocalDateTime now = LocalDateTime.now();
//转换成年月日
LocalDate localDate = now.toLocalDate();
System.out.println(localDate);
//转换成时分秒
LocalTime localTime = now.toLocalTime();
System.out.println(localTime);
}
}
获取年月日对象或者时分秒对象,则没有to转换方法,只有年月日时分秒可以转换成年月日或时分秒
日期字符串转换成日期对象:
package org.westos3.demo;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
public class MyTest2 {
public static void main(String[] args) throws ParseException {
//定义日期字符串
String dateStr = "2019-11-19 20:18:30";
//date日期类的转换
Date date = new SimpleDateFormat("yyyy-MM-dd").parse(dateStr);
System.out.println(date);
//LocalDate类的转换
LocalDate date1 = LocalDate.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println(date1);
//按照默认格式转换,日期字符串中间用T连接
String dateStr2 = "2019-11-19T20:18:30";
LocalDateTime date2 = LocalDateTime.parse(dateStr2);
System.out.println(date2);
}
}
- 与判断相关的方法
isAfter()判断一个日期是否在指定日期之后
isBefore()判断一个日期是否在指定日期之前
isEqual(); 判断两个日期是否相同
isLeapYear()判断是否是闰年注意是LocalDate类中的方法
package org.westos3.demo;
import java.time.LocalDate;
public class MyTest2 {
public static void main(String[] args) {
//获取当前日期2019-11-19
LocalDate now = LocalDate.now();
//指定日期2019-10-20
LocalDate of = LocalDate.of(2019, 10, 20);
//调用isAfter方法判断日期now是否在指定日期of之后
boolean after = now.isAfter(of);
System.out.println(after);
//调用isBefore方法判断日期now是否在指定日期of之前
boolean before = now.isBefore(of);
System.out.println(before);
//调用isEqual方法判断日期now和指定日期of是否一致
boolean equal = now.isEqual(of);
System.out.println(equal);
//调用isLeapYear方法判断当前日期now是否是闰年
boolean leapYear = now.isLeapYear();
System.out.println(leapYear);
}
}
输出结果验证:
- 添加和减去相应的时间量
(1)plusXXX 添加时间量,添加完之后,返回一个新的日期对象
(2)minusXXX减去时间量,返回的是一个新的日期对象
package org.westos3.demo;
import java.text.ParseException;
import java.time.LocalDate;
public class MyTest2 {
public static void main(String[] args) throws ParseException {
//获取当前年月日
LocalDate now = LocalDate.now();
System.out.println(now);
//添加一年两个月三天
LocalDate localDate = now.plusYears(1).plusMonths(2).plusDays(3);
System.out.println("添加后的时间是:"+localDate);
//减去一年两个月三天
LocalDate localDate1 = now.minusYears(1).minusMonths(2).minusDays(3);
System.out.println("减去后的时间是:"+localDate1);
}
}
- 更改日期:with系列 指定完都会返回一个新的日期对象
package org.westos3.demo;
import java.time.LocalDate;
public class MyTest2 {
public static void main(String[] args) {
//获取年月日
LocalDate now = LocalDate.now();
System.out.println(now);
//把年份改变成指定年份
LocalDate localDate = now.withYear(2020);
System.out.println(localDate);
}
}
更改月,日,时分秒类似
除此之外,还有一些其他的方法使用,比如Zoneld获取不同时区的时间,Duration计算两个时间戳的间隔,Period计算两个日期的间隔
- 时间校正器
TemporalAdjusters 工具类,里面提供了一些方法,可以指定一些特殊的日期,调用完之后,返回的就是TemporalAdjuster的子类对象
package org.westos3.demo;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.Temporal;
import java.time.temporal.TemporalAdjuster;
public class MyTest2 {
public static void main(String[] args) {
//获取年月日
LocalDate now = LocalDate.now();
//判断下一个工作日(星期一到星期五)是几号
LocalDate with = now.with(new TemporalAdjuster() {
@Override
public Temporal adjustInto(Temporal temporal) {
//如果是星期五+3天,星期六+2天,其余星期+1天
LocalDate localDate = (LocalDate) temporal;
DayOfWeek dayOfWeek = localDate.getDayOfWeek();
if (dayOfWeek.equals(DayOfWeek.FRIDAY)) {
return localDate.plusDays(3);
} else if (dayOfWeek.equals(DayOfWeek.SATURDAY)) {
return localDate.plusDays(2);
} else {
return localDate.plusDays(1);
}
}
});
System.out.println(with);
}
}