如何防止JodaTime期间的负面结果

时间:2018-06-14 17:30:18

标签: java android jodatime

我需要在使用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是否具有易于预防的功能,或者是我需要自己解决的某种问题?我正在寻找答案,但找不到可以帮助我的东西。我很高兴每一个输入答案和评论。

2 个答案:

答案 0 :(得分:1)

您可以在格式化之前检查期间是否为负数。如果是,则否定它以获得积极的时期。

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,只看过文档,但我确信这很有效。

答案 1 :(得分:1)

这里发生的事情是您使用的是DateTime类型(显然,它有"日期"以及"时间&# 34;组件),但您要使用仅包含有关时间信息的数据(您的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个对象,以便我们只考虑时间
  • 如果他们按照顺序",我们可以从正好时间计算这段时间
  • 如果他们没有"按顺序",将第一个转为"今天"日期时间和第二个进入"明天"日期时间,然后计算期间