Java8新的日期和时间
文章目录
一、Date 和Calender存在的问题
二、LocalDate 和 LocalTime
LocalDate 和LocalTime都是不可变对象。
2.1 创建并读取值LocalDate.of()
// 创建一个LocalDate
LocalDate date = LocalDate.of(2021, 9, 1);
// 从系统中获取当前时间
LocalDate nowDate = LocalDate.now();
// 年份
int year = date.getYear();
// 月分
Month month = date.getMonth();
// 天
int dayOfMonth = date.getDayOfMonth();
// 星期几: WEDNESDAY
DayOfWeek dayOfWeek = date.getDayOfWeek();
// 9 月有31天
int monthLen = date.lengthOfMonth();
// 是否为闰年
boolean leapYear = date.isLeapYear();
LocalTime:
LocalTime time = LocalTime.of(23, 14, 13);
int hour = time.getHour();
int minute = time.getMinute();
int second = time.getSecond();
2.2 通过TemporalField 结合get
获取属性
int year1 = date.get(ChronoField.YEAR);
int month1 = date.get(ChronoField.MONTH_OF_YEAR);
int day1 = date.get(ChronoField.DAY_OF_MONTH);
2.3 根据字符串创建日期和时间:parse
LocalDate date = LocalDate.parse("2021-09-02");
LocalTime time = LocalTime.parse("23:17:13");
三、LocalDateTime
LocalDateTime的设计是为了便于人使用
LocalDateTime dateTime = LocalDateTime.of(2021, 9, 1, 21, 23, 12);
LocalDate date = LocalDate.of(2021, 9, 1);
LocalTime time = LocalTime.of(19, 23, 21);
LocalDateTime dateTime1 = LocalDateTime.of(date, time);
四、Instant
Instant 的设计初衷是为了便于机器使用。从1970年1月1日午夜时分开始。它包含的是由秒和纳秒组成的数字
Instant instant = Instant.ofEpochSecond(3);
Instant instant1 = Instant.ofEpochSecond(3, 0);
Instant instant2 = Instant.ofEpochSecond(2, 1_000_000_000);
Instant instant3 = Instant.ofEpochSecond(3, -1_000_000_000);
五、Duration和Period,时间区间
5.1 Duration
duration 主要用于秒和纳秒衡量时间的长短。
Instant instant1 = Instant.ofEpochSecond(3);
Instant instant2 = Instant.ofEpochSecond(5);
Duration duration1 = Duration.between(instant1, instant2);
LocalDateTime dateTime1 = LocalDateTime.of(2021, 9, 8, 9, 23, 12);
LocalDateTime dateTime2 = LocalDateTime.of(2021, 12, 12, 9, 23, 12);
Duration duration = Duration.between(dateTime1, dateTime2);
5.2 Period
period 可以得到两个 LocalDate 的时长
LocalDate date1 = LocalDate.of(2021, 9, 13);
LocalDate date2 = LocalDate.of(2021, 10, 13);
Period period = Period.between(date1, date2);
六、操纵、解析、格式化
6.1 日期和时间的相加减
(1) 以绝对的方式修改日期
LocalDate date1 = LocalDate.now();
LocalDate date2 = date1.withYear(2020);
LocalDate date3 = date2.withDayOfMonth(25);
LocalDate date4 = date3.with(ChronoField.MONTH_OF_YEAR, 9);
(2) 以相对的方式修改日期
LocalDate date = LocalDate.now();
// 加
LocalDate date2 = date.plusWeeks(1);
// 减
LocalDate date3 = date.minusYears(3);
// 通用 运算
LocalDate date4 = date.plus(6, ChronoUnit.DAYS);
(3) 自定义的运算:TemporalAdjuster
LocalDate date = LocalDate.now();
LocalDate date1 = date.with(TemporalAdjusters.nextOrSame(DayOfWeek.MONDAY));
LocalDate date2 = date1.with(TemporalAdjusters.lastDayOfMonth());
下一个工作日:
private static TemporalAdjuster nextWorkingDay() {
return temporal->{
DayOfWeek dayOfWeek = DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));
int addToAdd = 1;
if (dayOfWeek==DayOfWeek.FRIDAY) {
addToAdd = 3;
}else if (dayOfWeek==DayOfWeek.SATURDAY) {
addToAdd = 4;
}
return temporal.plus(addToAdd, ChronoUnit.DAYS);
};
}
有个工厂方法:TemporalAdjusters.ofDateAdjuster
private static TemporalAdjuster nextWorkingDay2() {
return TemporalAdjusters.ofDateAdjuster(temporal->{
DayOfWeek dayOfWeek = DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));
int addToAdd = 1;
if (dayOfWeek==DayOfWeek.FRIDAY) {
addToAdd = 3;
}else if (dayOfWeek==DayOfWeek.SATURDAY) {
addToAdd = 4;
}
return temporal.plus(addToAdd, ChronoUnit.DAYS);
});
}
6.2 日期和时间格式化DateTimeFormatter
LocalDate date = LocalDate.now();
String format = date.format(DateTimeFormatter.ISO_LOCAL_DATE);
String format1 = date.format(DateTimeFormatter.BASIC_ISO_DATE);
自定义格式化:
LocalDate date = LocalDate.now();
String format = date.format(DateTimeFormatter.ISO_LOCAL_DATE);
String format1 = date.format(DateTimeFormatter.BASIC_ISO_DATE);
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
String format2 = date.format(dateTimeFormatter);
System.out.println(format2);
6.3 LocalDateTime 和 Instant的转换
LocalDateTime dateTime = LocalDateTime.now();
ZoneId zoneId = ZoneId.systemDefault();
Instant instant = dateTime.atZone(zoneId).toInstant();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zoneId);