JDK8发布之前日期处理方式,如下
//java8之前日期解决方案
//SimpleDateFormat为线程不安全
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(new Date()));
String dateStr = "2022-04-12 19:18:06";
Date date;
try {
date = sdf.parse(dateStr);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//日历类
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
//日期计算 加5天
calendar.add(Calendar.DAY_OF_MONTH, 5);
System.out.println(calendar.getTime());
JDK8引入LocalDate,LocalTime,LocalDateTime,Instant弥补jdk之前处理日期类型能力缺陷
LocalDate常用方法:
System.out.println("-----------------LocalDate---------------------");
LocalDate localDate = LocalDate.now();
System.out.println(localDate); //2022-04-12
System.out.println(localDate.getYear()+" "+localDate.getMonthValue()+" "+localDate.getDayOfMonth()); //2022 4 12
//指定生成一个LocalDate
localDate = LocalDate.of(2024, 5, 6);
System.out.println(localDate); //2024-05-06
//日期计算 加5天
localDate = localDate.plus(5, ChronoUnit.DAYS); //注意localDate.plus()之后会生成一个新的对象
System.out.println(localDate);//2024-05-11
//日期转字符串
System.out.println(localDate.format(DateTimeFormatter.ofPattern("yyyy/MM/dd"))); // 2024/05/11
//字符串转日期
String dateStr1 = "2020-06-05";
localDate = LocalDate.parse(dateStr1, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
System.out.println(localDate); //2020-06-05
//日期比较
LocalDate start = LocalDate.of(2020, 5, 6);
LocalDate end = LocalDate.of(2020, 6, 6);
System.out.println(start.compareTo(end));// -1
System.out.println(end.compareTo(start));// 1
//计算相差时间
Period periodLocalDate = Period.between(start,end);
System.out.println(periodLocalDate.getYears()); //0
System.out.println(periodLocalDate.getMonths()); //1
System.out.println(periodLocalDate.getDays()); //0
//计算两个日期相隔多少天
System.out.println(end.toEpochDay() - start.toEpochDay()); //31
//LocalDate 转换为 Date
localDate = LocalDate.of(2024, 5, 6);
//LocalDate 转 LocalDateTime 转 Instant 转 Date
//localDate取系统默认时区转为Instant时间点
Instant instant = localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant();
System.out.println(instant);//2024-05-05T16:00:00Z 注意转后的Instant为UTC标准时间
Date date2 = Date.from(instant);
System.out.println(date2); //Mon May 06 00:00:00 CST 2024
LocalTime的使用:
LocalTime localTime = LocalTime.now();
System.out.println(localTime); //19:50:58.313
//时间计算 加3小时30分
localTime = localTime.plusHours(3).plusMinutes(30);
System.out.println(localTime); //23:20:58.313
//时间比较
LocalTime startLocalTime = LocalTime.of(5, 10, 30); //05:10:30
LocalTime enLocalTime = LocalTime.of(13, 15, 15); //13:15:15
System.out.println(enLocalTime.compareTo(startLocalTime)); //1
//Clock
Clock clock = Clock.systemDefaultZone();
System.out.println(clock.millis()); //1649764782752
LocalDateTime的使用:
System.out.println("----------LocalDateTime-------------");
Set<String> set = ZoneId.getAvailableZoneIds();
// set.stream().sorted(String::compareToIgnoreCase).forEach(System.out::println);
//设置为当前时间
LocalDateTime nowTime = LocalDateTime.now();
//设置为指定时间
LocalDateTime localDateTime = LocalDateTime.of(2020, 1, 1, 10, 10, 30); //2020-01-01 10:10:30
System.out.println(localDateTime); //2020-01-01T10:10:30
//转字符串
String localDateTimeStr = localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println(localDateTimeStr); //2020-01-01 10:10:30
//转为时区时间 设置上海时区
ZoneId zonId = ZoneId.of("Asia/Shanghai");
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, zonId);
System.out.println(zonedDateTime); //2020-01-01T10:10:30+08:00[Asia/Shanghai]
System.out.println(zonedDateTime.toInstant());//2020-01-01T02:10:30Z
//ZonedDateTime转Date
Date dateTime = Date.from(zonedDateTime.toInstant());
System.out.println(dateTime);//ed Jan 01 10:10:30 CST 2020
//字符串转LocalDateTime
String dateTimeStr = "2022-01-01 10:10:30";
LocalDateTime localDateTime2 = LocalDateTime.parse(dateTimeStr,DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println(localDateTime2); //2022-01-01T10:10:30
//Date转LocalDateTime
LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();