如何防止乔达时间段的负面结果



我需要在使用JodaTime的应用程序中计算两个小时之间的周期,这是我的代码:

DateTimeFormatter format = DateTimeFormat.forPattern("HH:mm");
String s1 = textView9.getText().toString();
String s2 = textView10.getText().toString();
final DateTime dateTime1 = format.parseDateTime(s1);
final DateTime dateTime2 = format.parseDateTime(s2);
final PeriodFormatter periodFormatter = new PeriodFormatterBuilder()
.printZeroAlways()
.appendHours()
.appendLiteral("h")
.appendSeparator(":")
.printZeroIfSupported()
.appendMinutes()
.appendLiteral("min")
.toFormatter();
String sum = periodFormatter.print(new Period(dateTime1, dateTime2));
textView11.setText(sum);

到目前为止,这段代码可以工作并显示周期,但我注意到,如果s123:00并且s2是午夜之后的时间,那么假设第二天19:00,这个周期的输出将是-4:00。这是我的问题,JodaTime是否有轻松预防它的功能,或者它是我需要自己解决的某种问题?我一直在SO中寻找答案,但找不到可以帮助我的东西。我很高兴每个输入的答案和评论。

这里发生的事情是,您使用的是DateTime类型(很明显,它同时具有"日期"和"时间"组件(,但您正在使用仅包含有关一天中时间的信息(您的HH:mm字符串(的数据对其进行初始化。

此数据的更好表示形式是LocalTime类型,它仅表示"时间"组件。

听起来您肯定知道,对于每对时间,以下情况之一都是正确的:

  • 如果第二次是"在"第一次之后,则它们在同一天
  • 如果第二次是"之前"第一次,那么第二次实际上是在第二天

所以,这就是我要做的。改变这个:

final DateTime dateTime1 = format.parseDateTime(s1);
final DateTime dateTime2 = format.parseDateTime(s2);
...
String sum = periodFormatter.print(new Period(dateTime1, dateTime2));

这一点:

LocalTime time1 = format.parseLocalTime(s1);
LocalTime time2 = format.parseLocalTime(s2);
Period period;
if (time1.isBefore(time2)) {
period = new Period(time1, time2);
} else {
DateTime dateTime1 = time1.toDateTimeToday();
DateTime dateTime2 = time2.toDateTimeToday().plusDays(1);
period = new Period(dateTime1, dateTime2);
}
...
String sum = periodFormatter.print(period);

大致概述如下:

  • 构建两个LocalTime对象,以便我们只考虑时间
  • 如果它们是"有序的",我们可以从时间计算
  • 周期
  • 如果它们不是"按顺序"的,请将第一个转换为"今天"日期时间,将第二个转换为"明天"日期时间,然后计算周期

您可以在格式化之前检查句点是否为负数。如果是,请否定它以获得正周期。

Period period = new Period(dateTime1, dateTime2);
if (dateTime1.getMillis() > dateTime2.getMillis()) {
// 23:00 > 19:00 --> Period = -4:00 + 24:00 = 20:00
period = period.plusHours(24);
}
String sum = periodFormatter.print(period);
textView11.setText(sum);

免责声明:我从未使用过JodaTime,只查看了文档,但我很确定这是有效的。

最新更新