我正在构建一个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();
}
我错了什么?
谢谢!
答案 0 :(得分:3)
也许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)
在数学中,这种对称规则代表了一种常见distributive law的特殊形式,其中减号可以解释为乘以因子-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
- 类也被Java-8中的Java.time库所取代)很不幸(如果我们喜欢的话)必须被视为“特征”或不。