LocalDate、LocalTime、LocalDateTime
LocalDate、LocalTime、LocalDateTime 类的实例是不可变的对象
,分别表示使用ISO-8601
日历系统的日期、时间、日期和时间。它们提供了简单的日期或时间,并不包含当前的时间信息,也不包含与时区相关的信息。
注:ISO-8601日历系统是国际标准化组织制定的现代公民的日期和时间的表示法
基本使用
@Test
public void test1() {
// 当前时间
LocalDateTime now = LocalDateTime.now();
System.out.println(now);
// 指定时间 - 2020年4月29日16点43分33秒
LocalDateTime ldt1 = LocalDateTime.of(2020,4,29,16,43,33);
System.out.println(ldt1);
// 时间增加 - 增加20年
LocalDateTime ldt2 = ldt1.plusYears(20);
System.out.println(ldt2);
// 时间减少 - 减少2个月
LocalDateTime ldt3 = ldt1.minusMonths(2);
System.out.println(ldt3);
// 打印年月日 时分秒
System.out.println(now.getYear());
System.out.println(now.getMonthValue());
System.out.println(now.getDayOfMonth());
System.out.println(now.getHour());
System.out.println(now.getMinute());
System.out.println(now.getSecond());
}
时间戳 - Instant
用于“时间戳”的运算,它是以Unix元年
(传统的设定为UTC时区1970年1月1日午夜时分)开始所经历的描述进行运算。
@Test
public void test2() {
// 使用 Unix 元年 1970年1月1日 00:00:00 所经历的毫秒值
Instant ins = Instant.now(); // 默认使用UTC时区
System.out.println(ins);
OffsetDateTime odt = ins.atOffset(ZoneOffset.ofHours(8)); // 相差8个时区,进行偏移
System.out.println(odt);
System.out.println(ins.getNano()); // 毫秒值
Instant ins2 = Instant.ofEpochSecond(5); // 增加5秒
System.out.println(ins2);
}
Duration 和 Period
Duration:用于计算两个时间
间隔。
Period:用于计算两个日期
间隔。
@Test
public void test3() {
Instant ins1 = Instant.now();
try {
Thread.sleep(1000);
}catch (Exception e) {
e.printStackTrace();
}
Instant ins2 = Instant.now();
System.out.println("相差时间间隔为:" + Duration.between(ins1, ins2));
LocalDate ld1 = LocalDate.of(2016, 4, 1);
LocalDate ld2 = LocalDate.now();
Period period = Period.between(ld1, ld2);
System.out.println("相差时间间隔为:" + period);
System.out.println("年:" + period.getYears());
System.out.println("月:" + period.getMonths());
System.out.println("日:" + period.getDays());
}
日期的操纵
TemporalAdjuster : 时间校正器。有时我们可能需要获取例如:将日期调整到下个周日
等操作。
TemporalAdjusters : 该类通过静态方法提供了大量的常用 TemporalAdjuster 的实现。
@Test
public void test4() {
// 当前时间
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);
// 这个月的10号
LocalDateTime ldt2 = ldt.withDayOfMonth(10);
System.out.println(ldt2);
// 下个周日
LocalDateTime ldt3 = ldt.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
System.out.println(ldt3);
// 自定义 - 下一个工作日
LocalDateTime ldt5 = ldt.with(l -> {
LocalDateTime ldt4 = (LocalDateTime) l;
DayOfWeek dow = ldt4.getDayOfWeek(); // 这一天是周几
if (dow.equals(DayOfWeek.FRIDAY)) { // 这一天是周五
return ldt4.plusDays(3);
} else if (dow.equals(DayOfWeek.SATURDAY)) { // 这一天是周六
return ldt4.plusDays(2);
} else {
return ldt4.plusDays(1);
}
});
System.out.println(ldt5);
}
解析与格式化
@Test
public void test5() {
// 格式化格式
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
LocalDateTime ldt = LocalDateTime.now();
String strDate = ldt.format(dtf);
System.out.println(strDate);
// 转换回去
LocalDateTime newLdt = ldt.parse(strDate,dtf);
System.out.println(newLdt);
}
支持时区
@Test
public void test6(){
Set<String> set = ZoneId.getAvailableZoneIds();
set.forEach(System.out::println);
}
带时区的时间或日期
@Test
public void test7(){
LocalDateTime ldt = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
System.out.println(ldt);
ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("US/Pacific"));
System.out.println(zdt);
}