日期时间类:LocalDateTime //年月日时分秒
日期类:LocalDate // 年月日
时间类:LocalTime // 时分秒
时间戳:Instant
数据库中日期格式化
字符串格式化为日期
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
sf.parse("2000-1-1")
日期时间
//当前时间
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);//2022-05-15T15:01:21.451937400
// 按照给定的字符,格式化为时间对象
LocalDateTime ldt2 = LocalDateTime.of(2016, 11, 11, 13, 25, 14);
System.out.println(ldt2);//2016-11-11T13:25:14
// 两年以后的当前日期
LocalDateTime ldt3 = ldt.plusYears(2);
System.out.println(ldt3);//2024-05-15T15:01:21.451937400
// 两个月之前的当前时间
LocalDateTime ldt4 = ldt.minusMonths(2);
System.out.println(ldt4);//2022-03-15T15:01:21.451937400
// 本月10日同一时间
LocalDateTime ldt5 = ldt.withDayOfMonth(10);
System.out.println(ldt5);//2022-05-10T14:51:46.390582100
// 下周同一时间
LocalDateTime ldt6 = ldt.with(TemporalAdjusters.next(DayOfWeek.SATURDAY));
System.out.println(ldt6);//2022-05-21T14:51:46.390582100
// 自定义:下一个工作日
LocalDate ld = LocalDate.now().with((l) -> {
LocalDate ld1 = (LocalDate) l;
DayOfWeek dow = ld1.getDayOfWeek();
if (dow.equals(DayOfWeek.FRIDAY)) {
return ld1.plusDays(3);
} else if (dow.equals(DayOfWeek.SATURDAY)) {
return ld1.plusDays(2);
} else {
return ld1.plusDays(1);
}
System.out.println("下一个工作日是:" + ld);
// 从LocalDateTime对象中获取年、月、日、时、分、秒
System.out.println(ldt.getYear());
System.out.println(ldt.getMonthValue());
System.out.println(ldt.getDayOfMonth());
System.out.println(ldt.getHour());
System.out.println(ldt.getMinute());
System.out.println(ldt.getSecond());
}
时间戳、时区、计算间隔时间
// 默认使用 UTC 时区
Instant it = Instant.now();
System.out.println(it);//2022-05-15T06:49:43.758863500Z
// 设置为东8区的时间
OffsetDateTime odt = it.atOffset(ZoneOffset.ofHours(8));
System.out.println(odt);//2022-05-15T14:49:43.758863500+08:00
// 当前时间的时间戳
System.out.println(it.toEpochMilli());//1652597383758
// 通过时间戳的值计算日期
Instant it2 = Instant.ofEpochSecond(1);
System.out.println(it2);//1970-01-01T00:00:01Z
根据时间戳计算间隔时间
Instant ins1 = Instant.now();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Instant ins2 = Instant.now();
Duration between = Duration.between(ins1, ins2);
System.out.println(between.getSeconds());//间隔的秒数
使用时间计算时间间隔
// 以当前时间计算间隔
LocalTime lt1 = LocalTime.now();
System.out.println("lt1 = " + lt1);
try {
Thread.sleep(6000);
} catch (InterruptedException e) {
e.printStackTrace();
}
LocalTime lt2 = LocalTime.now();
System.out.println(Duration.between(lt1, lt2).toMillis());//间隔的毫秒数
}
DateTimeFormatter : 解析和格式化日期或时间
LocalDateTime ldt = LocalDateTime.now();//当前时间
// 格式化为 ISO_DATE 格式
DateTimeFormatter dtf = DateTimeFormatter.ISO_DATE;
String str = ldt.format(dtf);//iso格式化
System.out.println(str);//2022-05-15
System.out.println("-----------自定义格式化格式------------");
DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
String newDate = dtf2.format(ldt);//自定义格式化格式
System.out.println(newDate);//2022年05月15日 14:55:19
System.out.println("--------------去格式化恢复最初的格式----------------");
LocalDateTime ldt2 = LocalDateTime.parse(newDate, dtf2);//解析为最初的格式
System.out.println(ldt2);//2022-05-15T14:55:19
ZonedDate、ZonedTime、ZonedDateTime : 带时区的时间或日期
LocalDateTime ldt = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
System.out.println(ldt);//2022-05-15T15:00:01.859641600
ZonedDateTime zone = ldt.atZone(ZoneId.of("Asia/Shanghai"));
System.out.println(zone);//2022-05-15T15:00:01.859641600+08:00[Asia/Shanghai]
打印所有时区的名称
Set<String> zoneIds = ZoneId.getAvailableZoneIds();
zoneIds.forEach(System.out::println);