Java 如何计算Joda Time上带负号的2个周期的总和

Java 如何计算Joda Time上带负号的2个周期的总和,java,android,jodatime,period,Java,Android,Jodatime,Period,我正在构建一个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

我正在构建一个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();
    }
我怎么了


谢谢

也许乔达时代的异国情调让你感到困惑(就像我第一次尝试时那样)。详细内容:

case 1:  
time1 = 4:55
time2 = -7:10
time1 + time2 = -01:-55  --> this is wrong... I'm expected -3:45
解释负号的Joda时间策略是指将符号应用于每个时间部分,而不是整个持续时间本身。因此,我们没有55分钟-10分钟,而是55分钟+10分钟:

time1+time2=(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
time1+time2=(-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策略(现在也被JSR-310中的
Period
-class,又称java-8中的java.time库所取代)是一成不变的(不幸的是),如果我们喜欢与否,必须被视为“功能”。

感谢man提供了详尽的回复!现在对我来说更清楚了,我理解了一些以前无法理解的步骤……谢谢!:)