提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
问题背景:
在解决动态时间格式转化的时候遇到了HH:mm型格式无法转化的问题,大概原因就是SimpleDateFormat在格式化日期的时候只能去尾不能去头,而且该方法线程也不安全,这里推荐使用另一种方法DateTimeFormatter。
提示:以下是本篇文章正文内容,下面案例可供参考
一、用时间戳实例化Instant
这里简单介绍一下Instant:
Instant是Java 8中新增的日期API,早在JDK1.0时代,JDK就包含了一个与时间相关的java.util.Date类,而因为其本身的缺陷,其大多数方法都在JDK1.1时代被新引入的与时间相关的Calendar类取代。而Calendar类并不比Date类好太多,其本身也有不少问题,并且Calendar类虽然功能更强,其本身线程也是不安全的。
二、具体使用
直接上代码:
Instant instant = Instant.ofEpochMilli(1657652580000L); // 设置偏移量为8,以格林威治时间为基准偏移8为东八区时间 OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8)); // 此处可以是任意格式,例如:yyyy-MM-dd,yyyy,yyyy-MM,这里使用HH:mm。 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm", Locale.CHINA); // 输出为:03:03 System.out.println(formatter.format(offsetDateTime));
封装成工具类:
/** * 将Long型时间戳转成任意格式东八区String型时间 */ public static String longToAnyStringDate(Long time, String formatStr) { Instant instant = Instant.ofEpochMilli(time); // 设置偏移量为8 OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8)); DateTimeFormatter formatter = format.DateTimeFormatter.ofPattern(formatStr); return formatter.format(offsetDateTime); }
总结
时间格式转化方法很多,尽量使用功能更强,线程安全的方法,目前大部分时间格式转化的文章大都比较老,使用的还是线程不安全的SimpleDateFormat或者Calendar。