JAVA中计算两个日期时间的差值竟然也有这么多门道( 四 )


 
计算接口处理耗时在一些性能优化的场景中,我们需要获取到方法处理的执行耗时,很多人都是这么写的:
public void doSomething() {// 记录开始时间戳long startMillis = System.currentTimeMillis();// do something ...// 计算结束时间戳long endMillis = System.currentTimeMillis();// 计算相差的毫秒数System.out.println(endMillis - startMillis);}

JAVA中计算两个日期时间的差值竟然也有这么多门道

文章插图
 
当然啦,如果你使用的是JDK8+的版本,你还可以这么写:
public void doSomething() {// 记录开始时间戳Instant start = Instant.now();// do something ...// 计算结束时间戳Instant end = Instant.now();// 计算相差的毫秒数System.out.println(Duration.between(start, end).toMillis());}
JAVA中计算两个日期时间的差值竟然也有这么多门道

文章插图
 
时间格式转换项目中,时间格式转换是一个非常典型的日期处理操作,可能会涉及到将一个字符串日期转换为JAVA对象,或者是将一个JAVA日期对象转换为指定格式的字符串日期时间 。
SimpleDataFormat实现在JAVA8之前,通常会使用SimpleDateFormat类来处理日期与字符串之间的相互转换:
public void testDateFormatter() {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 日期转字符串String format = simpleDateFormat.format(new Date());System.out.println("当前时间:" + format);try {// 字符串转日期Date parseDate = simpleDateFormat.parse("2022-07-08 06:19:27");System.out.println("转换后Date对象: " + parseDate);// 按照指定的时区进行转换,可以对比下前面转换后的结果,会发现不一样simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT+5:00"));parseDate = simpleDateFormat.parse("2022-07-08 06:19:27");System.out.println("指定时区转换后Date对象: " + parseDate);} catch (Exception e) {e.printStackTrace();}}输出结果如下:
当前时间:2022-07-08 06:25:31转换后Date对象: Fri Jul 08 06:19:27 CST 2022指定时区转换后Date对象: Fri Jul 08 09:19:27 CST 2022补充说明:
SimpleDateFormat对象是非线程安全的,所以项目中在封装为工具方法使用的时候需要特别留意,最好结合ThreadLocal来适应在多线程场景的正确使用 。
JAVA8之后,推荐使用DateTimeFormat替代SimpleDateFormat 。

JAVA中计算两个日期时间的差值竟然也有这么多门道

文章插图
 
DataTimeFormatter实现JAVA8开始提供的新的用于日期与字符串之间转换的类,它很好的解决了SimpleDateFormat多线程的弊端,也可以更方便的与java.time中心的日期时间相关类的集成调用 。
public void testDateFormatter() {DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");LocalDateTime localDateTime = LocalDateTime.now();// 格式化为字符串String format = localDateTime.format(dateTimeFormatter);System.out.println("当前时间:" + format);// 字符串转DateLocalDateTime parse = LocalDateTime.parse("2022-07-08 06:19:27", dateTimeFormatter);Date date = Date.from(parse.atZone(ZoneId.systemDefault()).toInstant());System.out.println("转换后Date对象: " + date);}输出结果:
当前时间:2022-07-08 18:37:46转换后Date对象: Fri Jul 08 06:19:27 CST 2022
JAVA中计算两个日期时间的差值竟然也有这么多门道

文章插图
 
日期时间格式模板对于计算机而言,时间处理的时候按照基于时间原点的数字进行处理即可,但是转为人类方便识别的场景显示时,经常会需要转换为不同的日期时间显示格式,比如:
2022-07-08 12:02:342022/07/08 12:02:34.2382022年07月08日 12点03分48秒在JAVA中,为了方便各种格式转换,提供了基于时间模板进行转换的实现能力:
JAVA中计算两个日期时间的差值竟然也有这么多门道

文章插图
 
时间格式模板中的字幕含义说明如下:
字母
使用说明
yyyy
4位数的年份
yy
显示2位数的年份,比如2022年,则显示为22年
MM
显示2位数的月份,不满2位数的,前面补0,比如7月份显示07月
M
月份,不满2位的月份不会补0
dd
天,如果1位数的天数,则补0
d
天,不满2位数字的,不补0
HH
24小时制的时间显示,小时数,两位数,不满2位数字的前面补0
H
24小时制的时间显示,小时数,不满2位数字的不补0


推荐阅读