繁体   English   中英

如何计算Joda Time上2个带负号的和

[英]How to calculate sum from 2 period with negative sign on 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();
    }

我错了什么?

谢谢!

也许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分钟:

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的策略(现在也被JS-310中的Period -class和Java-8中的java.time库所取代)一成不变(不幸的是),如果我们喜欢或不喜欢它们必须被视为“特征”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM