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

标签 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 是否具有轻松防止它的功能,或者这是我需要自己解决的某种问题?我在 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 对象,以便我们只考虑时间
  • 如果它们“有序”,我们就可以根据时间计算周期
  • 如果它们不“有序”,将第一个变成“今天”日期时间,将第二个变成“明天”日期时间,然后计算周期

关于java - 如何防止 JodaTime 期间的负面结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50862980/

相关文章:

android - 当键盘在 android 中显示时,ScrollView 不工作

java - 使用 Joda Time 将简单的民用时间解析为完整的日期和时间

java - 从 WSDL 到 Java 对象 - 自动生成?

Java 8 Stream - 为什么过滤器方法不执行?

android - 检索 Android 应用程序中所有支持的方向

android - 如何保持位图中的纵横比可绘制

java - JMS 中的点对点与发布/订阅模型

java - 使用 XMLStreamReader API 读取 W3C 文档后解析它

java - 如何在Joda Time中使用中国历法?

java - Joda-Time 库无法在启用 Proguard 的 Android 5 上运行