1 00:00:36,800 --> 00:00:41,300 天下武功,皆出少林。
第一行是计数器,不用管。
第二行是时间轴,是我们的重点关注对象。这一行显示小时,分,秒,毫秒。然后用一个箭头隔开,表示从哪个时间到哪个时间显示第三行的字幕。void processLine(String line, int milliSecs) {
if(line.indexOf("-->") != -1) { // 这一行是时间轴
// 将字幕显示的起始时间和结束时间分开。
String timespan[] = line.split("-->");
// 起始时间的小时、分、秒、毫秒分开。
String begin[] = timespan[0].split("[:,]");
// 重点:把起始时间的小时、分、秒、毫秒统统加在一起构造一个Duration。
// plus方法是可串行的,就像StringBuffer的append。
Duration beginTime =
Duration.ofHours(Long.parseLong(begin[0].trim())).plus(
Duration.ofMinutes(Long.parseLong(begin[1].trim()))).plus(
Duration.ofSeconds(Long.parseLong(begin[2].trim()))).plus(
Duration.ofMillis(Long.parseLong(begin[3].trim())));
// 结束时间也如法炮制。
String end[] = timespan[1].split("[:,]");
Duration endTime =
Duration.ofHours(Long.parseLong(end[0].trim())).plus(
Duration.ofMinutes(Long.parseLong(end[1].trim()))).plus(
Duration.ofSeconds(Long.parseLong(end[2].trim()))).plus(
Duration.ofMillis(Long.parseLong(end[3].trim())));
// 把这两个时间分别加上我们希望的偏移量,也就是向前(milliSecs为负)或者向后移动的毫秒数,
// 得到两个新的Duration
Duration newStart = beginTime.plusMillis(milliSecs);
Duration newEnd = endTime.plusMillis(milliSecs);
// pw是一个PrintWriter,把调整后的一行时间轴写入新的字幕文件。
pw.println(parse(newStart) + " --> " + parse(newEnd));
} else {
pw.println(line); // 不是时间轴行,原样打印
}
}String parse(Duration d) {
long h = d.toHours(); // 得到小时数
String sh = h<10 ? "0" + h : "" + h; // 如果只有一位数,加上个0
// 为了得到后面的分,秒,毫秒,我们要将小时减掉,否则取分钟的时候会连小时算进去
d = d.minusHours(h);
long min = d.toMinutes(); // 得到分钟
String smin = min<10 ? "0" + min : "" + min;
d = d.minusMinutes(min); // 减掉分钟
long s = d.getSeconds(); // 得到秒,注意这里是getSeconds,没有toSeconds方法
String ss = s<10 ? "0" + s : "" + s;
d = d.minusSeconds(s); // 减掉秒
long m = d.toMillis(); // 得到毫秒
String sm = m<10 ? "00" + m : (m<100 ? "0" + m : "" + m);
return sh + ":" + smin + ":" + ss + "," + sm;
}http://download.csdn.net/detail/ioriogami/7626991
使用Java8提供的Duration类制作字幕时间轴调整工具,布布扣,bubuko.com
使用Java8提供的Duration类制作字幕时间轴调整工具
原文地址:http://blog.csdn.net/ioriogami/article/details/37728729