Joda Time: первый опыт

Joda Time: первый опыт

На днях передо мной встала, казалось бы, простейшая задача: представить отметку времени на видеофайле в формате «hh:mm:ss.SSS» в виде BigInteger в тысячных долях секунды. Использовать стандартный Java класс Date было неуместно, т.к. такой формат все равно приведется к дате (в этом случае к 1 марта 1970), что выльется в итоге в большое отрицательное число.

Среди других способов виделся только один — написать свой парсер. Дешево и сердито, а главное эффективно, учитывая, что времени на исследование и поиск способов решения сторонними средствами, как обычно, не было.

И вот за чашкой кофе коллега подсказал, что для подобных целей когда-то еще во времена Колчака они использовали библиотеку Joda Time. Решил попробовать эту библиотеку, тем более она оказалась доступна в зависимостях в родительском pom.xml.

Итоговый код получился вот таким (formattedCuePoint — строковая переменная с текстом типа «00:05:03.123»):

PeriodFormatter periodFormatter = new PeriodFormatterBuilder().appendHours().
     appendSeparator(":").appendMinutes().
     appendSeparator(":").appendSeconds().
     appendSeparator(".").appendMillis3Digit().toFormatter();

Period period = periodFormatter.parsePeriod(formattedCuePoint);

Теперь оставалось только получить из объекта period значение в милисекундах. Нашел в интернетах такое решение:

long durationInMillis = period.toStandardDuration().getMillis();

Но как обычно случился нежданчик: мой Eclipse наотрез отказался находить в метод Period#toStandardDuration(). Оказалось, этот метод появился в версии 1.5, а у нас в проекте используется древняя версия 1.4 (от ноября 2006 года), тогда как на момент написания этой статьи уже вышла версия 2.2. В силу сложной иерархии и нежелания рисковать, обновляя версию для всех проектов, пришлось в локальном pom.xml моего проекта указать версию поновее, чтобы насладиться прелестями этой библиотеки:

<dependency>
   <groupId>joda-time</groupId>
   <artifactId>joda-time</artifactId>
   <version>1.6.2</version>
</dependency>

После этого значение в милисекундах было получено и преобразовано в BigInteger:

BigInteger bigIntegerValue = new BigInteger(Long.toString(durationInMillis));

В итоге без лишних затрат и написания ненужного парсера я получил необходимый результат.