快速了解JDK8中的新日期时间类

积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里,不积小流无以成江海。齐骥一跃,不能十步,驽马十驾,功不在舍。面对悬崖峭壁,一百年也看不出一条裂缝来,但用斧凿,能进一寸进一寸,能进一尺进一尺,不断积累,飞跃必来,突破随之。

目录

在Java中常见的时间类为Date,格式化类型SimpleDateFormat。两者均不是线程安全的。这篇博文主要记录JDK8中的新时间日期类。

日期类LocalDate

时间输出

Date date = new Date();
System.out.println(date); //Mon Apr 18 13:31:08 CST 2022

LocalDate local = LocalDate.now(); 
System.out.println(local); //2022-04-18

格式化

Date常用SimpleDateFormat进行格式化;而LocalDate使用DateTimeFormatter进行格式化。

Date格式化
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
System.out.println(sdf.format(date)); //2022年04月18日
LocalDate格式化
LocalDate local = LocalDate.now();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
System.out.println(local.format(dtf)); //2022年04月18日

可以看见,格式化时两者的方式还是有区别的。

总结

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); //2022年04月18日
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

📢使用注意:

  • 日期的位数必须和格式化时的位数对齐。比如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); //2022-04-18
LocalDate转Date
LocalDate local = LocalDate.now();
Date from = Date.from(local.atStartOfDay(ZoneId.systemDefault()).toInstant());
System.out.println(from); //Mon Apr 18 00:00:00 CST 2022

时间类LocalTime

获取时间

LocalTime localTime = LocalTime.now();
System.out.println(localTime); //14:14:14.981

时间格式化

LocalTime lt = LocalTime.now();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("mm分ss秒HH时");
System.out.println(lt.format(dateTimeFormatter)); //27分11秒14时

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); //10:51:01
LocalTime转String
LocalTime lt = LocalTime.now();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("HH时mm分ss秒");
String s = lt.format(dateTimeFormatter);
System.out.println(s); //14时28分28秒
两个时间间隔
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+"秒"); //两个时间相差:32秒

时间比较

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)); //false
System.out.println(before.isBefore(after)); //true

System.out.println(before.compareTo(after)); //-1
System.out.println(after.compareTo(before)); //1
System.out.println(before.compareTo(before)); //0

获取时、分、秒、纳秒

LocalTime now = LocalTime.parse("15:51:01.167526700");

//获取小时
System.out.println(now.getHour()); //15
//获取分钟
System.out.println(now.getMinute()); //51
//获取秒
System.out.println(now.getSecond()); //1
//获取纳秒
System.out.println(now.getNano()); //167526700

修改时间

LocalTime time = LocalTime.parse("10:51:03.167526700");
//修改LocalTime变量的小时
System.out.println(time.withHour(1)); //01:51:03.167526700
//修改LocalTime变量的分钟
System.out.println(time.withMinute(1)); //10:01:03.167526700
//修改LocalTime变量的秒
System.out.println(time.withSecond(1)); //10:51:01.167526700
//修改LocalTime变量的纳秒
System.out.println(time.withNano(1)); //10:51:03.000000001

日期时间类LocalDateTime

组合了日期和时间,但不包含时差和时区信息。

获取当前

LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime); //2022-04-18T14:36:25.591

格式化

LocalDateTime localDateTime = LocalDateTime.now();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒");
System.out.println(localDateTime.format(dtf)); //2022年04月18日 14时39分28秒

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); //2022-04-18T14:39:28
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); //2022年04月18日 14时43分13秒
时间戳转LocalDateTime
long timestamp = System.currentTimeMillis();
Instant instant1 = Instant.ofEpochMilli(timestamp);
System.out.println(LocalDateTime.ofInstant(instant1, ZoneId.systemDefault())); //2022-04-18T14:12:36.897

日期时间类ZonedDateTime

最完整的日期时间,包含时区和相对UTC或格林威治的时差。

ZonedDateTime zdt = ZonedDateTime.now();
System.out.println(zdt); //2022-04-18T14:35:47.091+08:00[Asia/Shanghai]

总结

  • 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]。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值