2016-04-05 2 views
0

Я пытаюсь перенести datetime на Duration, который я получаю в формате «HHmm», например «0010», что означает 10 минут.Как анализировать продолжительность в формате «HHmm» с использованием JodaTime?

Я нашел аналогичный билет (Parsing time strings like "1h 30min"), но я не могу заставить его работать должным образом.

Вот код:

PeriodFormatter hoursMinutes = new PeriodFormatterBuilder().appendHours().appendMinutes().toFormatter(); 
Duration duration = hoursMinutes.parsePeriod("0010").toStandardDuration(); 
duration.getStandardMinutes(); //Returns 600 

По какой-то причине, я получаю 600 минут вместо 10. Так выглядит минуты интерпретировались как часы, но я не могу понять, почему. Я пробовал добавлять .maximumParsedDigits(2) в течение нескольких часов, но результат был тот же.

Почему мой код не так ли? Есть ли другой способ инициализации парсера продолжительности? Что-то, где я мог бы просто использовать стандартный формат, такой как «HHmm»?

ответ

1

Таким образом, проблема была в самом деле с максимальными разборчивостями. Мне приходилось добавлять его только несколько часов, а не минут. Таким образом, решение таково:

PeriodFormatter hoursMinutes = 
       new PeriodFormatterBuilder().maximumParsedDigits(2).appendHours().appendMinutes().toFormatter(); 
Duration duration = hoursMinutes.parsePeriod("0010").toStandardDuration(); 
duration.getStandardMinutes(); //Returns 10 
+0

Ну ладно, ты был быстрее +1, поэтому я удалил свой ответ. Лично я предпочитаю шаблонный подход, например, используя мой lib Time4J: 'Duration d = Duration.formatter (ClockUnit.class," #hmm "). Parse (" 0010 "); длинные минуты = ClockUnit.MINUTES.convert (d); System.out.println (минуты); // 10' –

+0

Мне также нравится ваше решение больше, но я не хочу добавлять другую библиотеку только для этого. – NeplatnyUdaj

+0

Справедливая точка, миграция всегда работает. –

0

Согласно documentation:

getStandardMinutes

общественные длинные getStandardMinutes()

Получает длину этой длительности в течение нескольких минут, предполагая, что существует стандартное количество миллисекунд в минуту. Этот метод предполагает, что есть 60 секунд в минуту и ​​1000 миллисекунд в секунду. Все используемые в настоящее время хронологии используют это определение.

Это возвращает getMillis()/60000. Результатом является целочисленное деление, , таким образом, избыточные миллисекунды усекаются.

Возвращает: длина длительности в стандартных секундах

Видя, как 600 на самом деле 10 минут в секундах (60 * 10), вы получили ответ, который вы ожидали.

+0

Я не думаю, что в документации говорится, что вы подразумеваете. Проблема не в 'getStandardMinutes()', а в значении Duration. Когда я вызываю 'getStandardHours()', он печатает '10'. Когда я добавляю эту продолжительность в ReadableInstant, например DateTime, она действительно сдвигается на 10 часов, а не на 10 минут. – NeplatnyUdaj

+0

Я думаю, что документация (возврат) неверна. – NeplatnyUdaj

+0

Итак, да ... документация говорит то, что вы подразумеваете, но это ложь. 'getMillis()/60000', очевидно, не является значением в секундах. – NeplatnyUdaj

Смежные вопросы