如何防止 JodaTime 期间的负面结果
How to prevent negative result of JodaTime period
我需要在使用 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);
到目前为止这段代码可以工作并显示句点,但我注意到如果 s1
表示 23:00
并且 s2
是午夜后的时间,假设 19:00
的第二天,本期的输出将是 -4:00
。这是我的问题,JodaTime 是否具有轻松防止它的功能,或者这是我需要自己解决的某种问题?我在 SO 中寻找答案,但找不到可以帮助我的东西。我很高兴收到每一个输入的答案和评论。
您可以在格式化之前检查句点是否为负数。如果是,则将其取反以获得正周期。
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,只查看了文档,但我很确定它有效。
这里发生的事情是您正在使用 DateTime
类型(很明显,它同时具有 "date" 和 "time" 组件),但是您正在初始化它的数据仅包含有关一天中时间的信息(您的 HH:mm
字符串)。
此数据的更好表示形式是 LocalTime
类型,它仅表示 "time" 分量。
听起来您肯定知道,对于每一对时间,以下其中一项为真:
- 如果第二次是"after"第一次,则它们在同一天
- 如果第二次是"before"第一次,第二次其实是在下天
所以,这就是我要做的。改变这个:
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
对象,以便我们只考虑时间
- 如果它们是 "in order",我们可以从时间
计算周期
- 如果它们不是 "in order",将第一个变成 "today" 日期时间,将第二个变成 "tomorrow" 日期时间,然后计算周期
我需要在使用 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);
到目前为止这段代码可以工作并显示句点,但我注意到如果 s1
表示 23:00
并且 s2
是午夜后的时间,假设 19:00
的第二天,本期的输出将是 -4:00
。这是我的问题,JodaTime 是否具有轻松防止它的功能,或者这是我需要自己解决的某种问题?我在 SO 中寻找答案,但找不到可以帮助我的东西。我很高兴收到每一个输入的答案和评论。
您可以在格式化之前检查句点是否为负数。如果是,则将其取反以获得正周期。
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,只查看了文档,但我很确定它有效。
这里发生的事情是您正在使用 DateTime
类型(很明显,它同时具有 "date" 和 "time" 组件),但是您正在初始化它的数据仅包含有关一天中时间的信息(您的 HH:mm
字符串)。
此数据的更好表示形式是 LocalTime
类型,它仅表示 "time" 分量。
听起来您肯定知道,对于每一对时间,以下其中一项为真:
- 如果第二次是"after"第一次,则它们在同一天
- 如果第二次是"before"第一次,第二次其实是在下天
所以,这就是我要做的。改变这个:
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
对象,以便我们只考虑时间 - 如果它们是 "in order",我们可以从时间 计算周期
- 如果它们不是 "in order",将第一个变成 "today" 日期时间,将第二个变成 "tomorrow" 日期时间,然后计算周期