Java 如何将形如1h58m的时长变量添加到当前时间计算结束时间
解决方案
你可以按照「解析时长字符串→计算结束时间→格式化输出」三个步骤实现,以下是两种常用的实现方案:
方案1:兼容Java 8之前的版本(使用Date+Calendar实现)
先解析runtime字符串提取小时、分钟数值,再通过Calendar类完成时间相加操作,完整代码如下:
public void playMovie(Movie movie){ String runtime = movie.getRuntime(); // 从movie对象取时长,格式为XhYm String name = movie.getName(); // 获取电影名称 // 1. 解析时长字符串,提取小时和分钟数 int hours = 0; int minutes = 0; // 提取小时数 if(runtime.contains("h")){ String hStr = runtime.split("h")[0]; hours = Integer.parseInt(hStr); runtime = runtime.split("h")[1]; } // 提取分钟数 if(runtime.contains("m")){ String mStr = runtime.split("m")[0]; minutes = Integer.parseInt(mStr); } // 2. 计算电影结束时间 SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy hh:mmaa"); Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.HOUR_OF_DAY, hours); calendar.add(Calendar.MINUTE, minutes); Date endDate = calendar.getTime(); // 3. 按要求输出结果 System.out.println("The runtime of " + name + " is " + movie.getRuntime() + "."); System.out.println(name + " will end at " + df.format(endDate)); }
注意:SimpleDateFormat是线程不安全的,多线程场景下需要单独实例化使用,不要定义为公共静态变量
方案2:Java 8及以上版本(推荐,使用新版时间API实现)
Java 8新增的java.time包下的类解决了旧版Date、Calendar的线程安全、设计不合理问题,实现更简便:
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; public void playMovie(Movie movie){ String runtime = movie.getRuntime(); String name = movie.getName(); // 1. 用正则表达式精准匹配解析时长 Pattern pattern = Pattern.compile("(\\d+)h(\\d+)m"); Matcher matcher = pattern.matcher(runtime); int hours = 0; int minutes = 0; if(matcher.find()){ hours = Integer.parseInt(matcher.group(1)); minutes = Integer.parseInt(matcher.group(2)); } // 2. 计算结束时间 LocalDateTime endTime = LocalDateTime.now() .plus(hours, ChronoUnit.HOURS) .plus(minutes, ChronoUnit.MINUTES); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mma"); // 3. 输出结果 System.out.println("The runtime of " + name + " is " + runtime + "."); System.out.println(name + " will end at " + endTime.format(formatter)); }
内容的提问来源于stack exchange,提问作者koncameron
相关产品推荐
相关产品推荐

