本文最后更新于:April 18, 2022 pm
积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里,不积小流无以成江海。齐骥一跃,不能十步,驽马十驾,功不在舍。面对悬崖峭壁,一百年也看不出一条裂缝来,但用斧凿,能进一寸进一寸,能进一尺进一尺,不断积累,飞跃必来,突破随之。
目录 在Java中常见的时间类为Date,格式化类型SimpleDateFormat。两者均不是线程安全的。这篇博文主要记录JDK8中的新时间日期类。
日期类LocalDate 时间输出 Date date = new Date(); System.out.println(date); LocalDate local = LocalDate.now(); System.out.println(local);
格式化 Date常用SimpleDateFormat进行格式化;而LocalDate使用DateTimeFormatter进行格式化。
Date格式化 Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日" ); System.out.println(sdf.format(date));
LocalDate格式化 LocalDate local = LocalDate.now(); DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日" ); System.out.println(local.format(dtf));
可以看见,格式化时两者的方式还是有区别的。
总结 Date包含了日期、时间、毫秒数众多的信息。LocalDate不包含时间,描述的是日期,如果对时间不关心,可以使用LocalDate。
DateTimeFormatter 不但是不变对象,它还是线程安全的。所以 DateTimeFormatter 可以只创建一个实例,到处引用。
LocalDate的常用用法 LocalDate转String LocalDate localDate = LocalDate.now(); DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日" ); String Str = localDate.format(dtf); System.out.println(Str);
String转LocalDate String s = "2022年07月13日" ; DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日" ); LocalDate date = LocalDate.parse(s,dtf); System.out.println(date);
📢使用注意:
日期的位数必须和格式化时的位数对齐。比如2022年07月13日,则dtf必须为yyyy年MM月dd日
;如果是2022年7月13日,则dtf必须为yyyy年M月dd日
。其他同理。
Date转LocalDate Date date = new Date(); LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); System.out.println(localDate);
LocalDate转Date LocalDate local = LocalDate.now(); Date from = Date.from(local.atStartOfDay(ZoneId.systemDefault()).toInstant()); System.out.println(from);
时间类LocalTime 获取时间 LocalTime localTime = LocalTime.now(); System.out.println(localTime);
时间格式化 LocalTime lt = LocalTime.now(); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("mm分ss秒HH时" ); System.out.println(lt.format(dateTimeFormatter));
LocalTime的常用用法 String转LocalTime String s = "10:51:01" ; DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss" ); LocalTime parse = LocalTime.parse(s, dateTimeFormatter); System.out.println(parse);
LocalTime转String LocalTime lt = LocalTime.now(); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("HH时mm分ss秒" ); String s = lt.format(dateTimeFormatter); System.out.println(s);
两个时间间隔 LocalTime start = LocalTime.parse("10:51:01.167526700" ); LocalTime end = LocalTime.parse("10:51:33.167526701" );int time = end.toSecondOfDay() - start.toSecondOfDay(); System.out.println("两个时间相差:" +time+"秒" );
时间比较 isAfter、isBefore只能比较之前之后,当值相等的时候,需要用compareTo比较。时间比较localTimeA.compareTo(localTimeB),若相等返回0;若A>B,返回1 ;若A<B返回-1。
LocalTime before = LocalTime.parse("10:51:01.167526700" ); LocalTime after = LocalTime.parse("15:51:01.167526700" ); System.out.println(before.isAfter(after)); System.out.println(before.isBefore(after)); System.out.println(before.compareTo(after)); System.out.println(after.compareTo(before)); System.out.println(before.compareTo(before));
获取时、分、秒、纳秒 LocalTime now = LocalTime.parse("15:51:01.167526700" ); System.out.println(now.getHour()); System.out.println(now.getMinute()); System.out.println(now.getSecond()); System.out.println(now.getNano());
修改时间 LocalTime time = LocalTime.parse("10:51:03.167526700" ); System.out.println(time.withHour(1 )); System.out.println(time.withMinute(1 )); System.out.println(time.withSecond(1 )); System.out.println(time.withNano(1 ));
日期时间类LocalDateTime 组合了日期和时间,但不包含时差和时区信息。
获取当前 LocalDateTime localDateTime = LocalDateTime.now(); System.out.println(localDateTime);
格式化 LocalDateTime localDateTime = LocalDateTime.now(); DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒" ); System.out.println(localDateTime.format(dtf));
LocalDateTime常用用法 String转LocalDateTime String s = "2022-04-18 14:39:28" ; DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss" ); LocalDateTime parse = LocalDateTime.parse(s, dtf); System.out.println(parse);
LocalDateTime转String LocalDateTime localDateTime = LocalDateTime.now(); DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒" ); String s = localDateTime.format(dtf); System.out.println(s);
时间戳转LocalDateTime long timestamp = System.currentTimeMillis(); Instant instant1 = Instant.ofEpochMilli(timestamp); System.out.println(LocalDateTime.ofInstant(instant1, ZoneId.systemDefault()));
日期时间类ZonedDateTime 最完整的日期时间,包含时区和相对UTC或格林威治的时差。
ZonedDateTime zdt = ZonedDateTime.now(); System.out.println(zdt);
总结
LocalDate:本地日期,不包含具体时间。 例如:2014-01-14等。
LocalTime:本地时间,不包含日期。例如:14:07:13:073。分别表示时、分、秒、毫秒。
LocalDateTime:组合了日期和时间,但不包含时差和时区信息。例如:2022-04-18T14:09:25.665
ZonedDateTime:最完整的日期时间,包含时区和相对UTC或格林威治的时差。例如:2022-04-18T14:10:13.997+08:00[Asia/Shanghai]。