Вам не нужна сторонняя библиотека
Это простая математика, которая напрямую не имеет ничего общего с Date
DateTime
или Timestamp
экземплярами, но, похоже, имеет отношение interval
, и в нее встроены функциональные возможности. JDK> = 1.5 с java.util.concurrent.TimeUnit
для обработки только этого типа математики без введения каких-либо зависимостей.
Вот код для анализа вашего ввода и преобразования его в миллисекунды, которые вы можете затем преобразовать обратно в любой формат String
, какой вы пожелаете, я удобно выбрал формат, который вы запрашивали.
java.util.concurrent.TimeUnit - это небольшая скрытая жемчужина, о которой большинство людей не знают о подобном подобии в 1.5. Это своего рода преступление, что этот класс похоронен в пакете java.util.concurrent
, и никто, кажется, не знает об этом.
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main
{
private static long parseInterval(final String s)
{
final Pattern p = Pattern.compile("^(\\d{2}):(\\d{2}):(\\d{2})\\.(\\d{3})$");
final Matcher m = p.matcher(s);
if (m.matches())
{
final long hr = Long.parseLong(m.group(1)) * TimeUnit.HOURS.toMillis(1);
final long min = Long.parseLong(m.group(2)) * TimeUnit.MINUTES.toMillis(1);
final long sec = Long.parseLong(m.group(3)) * TimeUnit.SECONDS.toMillis(1);
final long ms = Long.parseLong(m.group(4));
return hr + min + sec + ms;
}
else
{
throw new IllegalArgumentException(s + " is not a supported interval format!");
}
}
private static String formatInterval(final long l)
{
final long hr = TimeUnit.MILLISECONDS.toHours(l);
final long min = TimeUnit.MILLISECONDS.toMinutes(l - TimeUnit.HOURS.toMillis(hr));
final long sec = TimeUnit.MILLISECONDS.toSeconds(l - TimeUnit.HOURS.toMillis(hr) - TimeUnit.MINUTES.toMillis(min));
final long ms = TimeUnit.MILLISECONDS.toMillis(l - TimeUnit.HOURS.toMillis(hr) - TimeUnit.MINUTES.toMillis(min) - TimeUnit.SECONDS.toMillis(sec));
return String.format("%02d:%02d:%02d.%03d", hr, min, sec, ms);
}
public static void main(final String[] args)
{
final String s1 = "36:00:00.000";
final String s2 = "23:00:00.000";
final long i1 = parseInterval(s1);
final long i2 = parseInterval(s2);
System.out.println(formatInterval(i1 - i2));
}
}
вывод
13:00:00.000
Я полагаю, вы имели в виду, что последнее число должно быть milliseconds
, которое должно иметь разрешение 3 цифры.