Как рассчитать сумму за 2 периода с отрицательным знаком Joda Time

Я создаю приложение для Android, и я бы сделал сумму двух периодов, используя библиотеку jodatime. На самом деле, у меня проблема с управлением знаком, потому что у меня мог быть только один период с отрицательным знаком. Я попробовал код, чтобы сделать это, но результат неправильный для меня.

пример:

case 1: 
time1 = 4:55   
time2 = -7:10  
time1 + time2 = -01:-55  --> this is wrong... I'm expected -3:45

case 2:
time1 = -4:55 
time2 = 7:10
time1 + time2 = 4:05  --> this is correct

Это мой пример кода:

public static void main(String[] args) 
    {
        String output;
        String time1 = "-4:55";
        String time2 = "7:10";

        Duration durationSum = Duration.ZERO;
        PeriodFormatter formatter = getFormatterBuilder();
        Period period1 = formatter.parsePeriod(time1);
        Duration duration1 = period1.toStandardDuration();
        Period period2 = formatter.parsePeriod(time2);
        Duration duration2 = period2.toStandardDuration();

        output = formatter.print(durationSum.plus(duration1).plus(duration2).toPeriod());

        System.out.println(output);

    }

    private static PeriodFormatter getFormatterBuilder()
    {
        return new PeriodFormatterBuilder()
                .minimumPrintedDigits(2)
                .printZeroAlways()
                .appendHours()
                .appendLiteral(":")
                .appendMinutes()
                .toFormatter();
    }

Что я не прав?

Спасибо!

1 ответ

Решение

Возможно, экзотическая обработка знаков Joda-Time смутила вас (как я с первой попытки). В деталях:

case 1:  
time1 = 4:55
time2 = -7:10
time1 + time2 = -01:-55  --> this is wrong... I'm expected -3:45

Стратегия Joda-Time для интерпретации отрицательного знака означает, что знак должен применяться к каждому компоненту времени, а НЕ ко всей продолжительности. Таким образом, у нас нет 55 минут - 10 минут, но 55 минут + 10 минут:

время1 + время2 = (4:55) + (-7:10) = (+4 часа + 55 минут) + (-7 часов + 10 минут) = (4 * 60 минут + 55 минут) + (-7 * 60 минут + 10 минут) = 295 минут - 410 минут = -115 минут = -1 час - 55 минут

Мы видим, что Joda-Time, следовательно, выполняет свою знаковую стратегию.

Однако та же самая стратегия знака подтверждает ваше второе ожидание:

case 2:
time1 = -4:55 
time2 = 7:10
time1 + time2 = 4:05  --> this is correct

время1 + время2 = (-4:55) + (7:10) = (-4 часа + 55 минут) + (7 часов + 10 минут) = (-4 * 60 минут + 55 минут) + (7 * 60 минут + 10 минут) = -185 минут + 430 минут = 245 минут = 4 часа + 5 минут

Важное замечание о стратегии Joda-Time: как видно из приведенных вами примеров, Joda-Time нарушает правило симметрии

-(time1 - time2) != (time2 - time1)

В математике это правило симметрии представляет собой специализированную форму общего закона распределения, где знак минус можно интерпретировать как умножение на коэффициент -1. Если бы Joda-Time выбрал гораздо более подходящую стратегию знаков, чтобы вместо этого применять знак на всей продолжительности, тогда вычисление даст:

случай 1: (4:55) + (-7:10) = (4 часа + 55 минут) + (-7 часов - 10 минут) = 295 минут - 430 минут = -135 минут = -2:15 (имеется в виду - 2 часа - 15 минут)

дело 2: (-4:55) + (7:10) = (-4 часа - 55 минут) + (7 часов + 10 минут) = -295 минут + 430 минут = 135 минут = 2:15

Эта интуитивная стратегия обеспечила бы упомянутое выше правило симметрии. Но стратегия Jodas (и теперь настигла Period-класс в JSR-310, также известный как библиотека java.time в Java-8, тоже установлен в камне (к сожалению) и должен рассматриваться как "особенность", нравится нам это или нет.

Другие вопросы по тегам