从负 Joda 时间段中删除“-”
Removing '-' from negative Joda time Periods
我有一个关于减去 Joda DateTimes 的问题,我使用 Period 来获取两者之间的日期、小时、分钟和秒数。
输出示例:2 天 11 小时 23 分钟 05 秒
DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
DateTime firstDate = formatter.parseDateTime(firstStringDateValue);
DateTime secondDate = formatter.parseDateTime(secondStringDateValue);
DurationFieldType[] types = {DurationFieldType.days(),
DurationFieldType.hours(),
DurationFieldType.minutes(),
DurationFieldType.seconds()};
Period period = new Period(firstDate, secondDate, PeriodType.forFields(types));
PeriodFormatter periodFormatter = new PeriodFormatterBuilder()
.minimumPrintedDigits(2)
.appendDays().appendSuffix(" Day", " Days").appendSeparator(" ")
.appendHours().appendSuffix("h").appendSeparator(" ")
.appendMinutes().appendSuffix("min").appendSeparator(" ")
.appendSeconds().appendSuffix("sec")
.toFormatter();
String result = periodFormatter.print(period);
问题是开始日期大于结束日期。
结果是这样的:-2 天 -11 小时 -23 分钟 -05 秒
所以我想知道有没有办法让它看起来像这样:- 2 天 11 小时 23 分 05 秒,整个事情前面只有一个“-”。但是使用 Joda 相关的功能。
或者至少有一种方法可以告诉我 Period 是否为负数。
我可以使用字符串操作来做到这一点,但它似乎有点太手动了。
谢谢。
你需要的是比较两个日期。
有 isAfter and isBefore 方法可以按毫秒比较日期(忽略时区)。
firstDate.isBefore(secondDate)
firstDate.isAfter(secondDate)
现在,您可以按正确的顺序设置参数了。
然后,根据需要添加前导减号。
不幸的是,Period
has no method abs()
in comparison with Duration
。
但是,我们可以编写自己的辅助方法,借助 Period::negated()
方法来实现此目的:
public static Period periodAbs(Period period) {
return period.toStandardSeconds().getSeconds() < 0
? period.negated()
: period;
}
此外,如果你不喜欢静态方法,你可以提取这个逻辑来分离 class(我认为这绝对是更好的选择):
public static class AbsPeriod {
private final Period period;
public AbsPeriod(Period period) {
this.period = period;
}
public Period value() {
return period.toStandardSeconds().getSeconds() < 0
? period.negated()
: period;
}
}
完整的可运行示例:
import org.joda.time.DateTime;
import org.joda.time.DurationFieldType;
import org.joda.time.Period;
import org.joda.time.PeriodType;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.PeriodFormatter;
import org.joda.time.format.PeriodFormatterBuilder;
class Scratch {
public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
DateTime firstDate = formatter.parseDateTime("12/11/2001 12:12:12");
DateTime secondDate = formatter.parseDateTime("12/11/2000 12:12:12");
DurationFieldType[] types = {DurationFieldType.days(),
DurationFieldType.hours(),
DurationFieldType.minutes(),
DurationFieldType.seconds()};
Period period = new Period(firstDate, secondDate, PeriodType.forFields(types));
PeriodFormatter periodFormatter = new PeriodFormatterBuilder()
.minimumPrintedDigits(2)
.appendDays().appendSuffix(" Day", " Days").appendSeparator(" ")
.appendHours().appendSuffix("h").appendSeparator(" ")
.appendMinutes().appendSuffix("min").appendSeparator(" ")
.appendSeconds().appendSuffix("sec")
.toFormatter();
System.out.println("original period = " + periodFormatter.print(period));
System.out.println("absolute period = " + periodFormatter.print(new AbsPeriod(period).value()));
}
public static class AbsPeriod {
private final Period period;
public AbsPeriod(Period period) {
this.period = period;
}
public Period value() {
return period.toStandardSeconds().getSeconds() < 0
? period.negated()
: period;
}
}
}
以及此测试片段生成的相应 STDOUT:
original period = -365 Days
absolute period = 365 Days
我有一个关于减去 Joda DateTimes 的问题,我使用 Period 来获取两者之间的日期、小时、分钟和秒数。
输出示例:2 天 11 小时 23 分钟 05 秒
DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
DateTime firstDate = formatter.parseDateTime(firstStringDateValue);
DateTime secondDate = formatter.parseDateTime(secondStringDateValue);
DurationFieldType[] types = {DurationFieldType.days(),
DurationFieldType.hours(),
DurationFieldType.minutes(),
DurationFieldType.seconds()};
Period period = new Period(firstDate, secondDate, PeriodType.forFields(types));
PeriodFormatter periodFormatter = new PeriodFormatterBuilder()
.minimumPrintedDigits(2)
.appendDays().appendSuffix(" Day", " Days").appendSeparator(" ")
.appendHours().appendSuffix("h").appendSeparator(" ")
.appendMinutes().appendSuffix("min").appendSeparator(" ")
.appendSeconds().appendSuffix("sec")
.toFormatter();
String result = periodFormatter.print(period);
问题是开始日期大于结束日期。
结果是这样的:-2 天 -11 小时 -23 分钟 -05 秒
所以我想知道有没有办法让它看起来像这样:- 2 天 11 小时 23 分 05 秒,整个事情前面只有一个“-”。但是使用 Joda 相关的功能。
或者至少有一种方法可以告诉我 Period 是否为负数。
我可以使用字符串操作来做到这一点,但它似乎有点太手动了。
谢谢。
你需要的是比较两个日期。
有 isAfter and isBefore 方法可以按毫秒比较日期(忽略时区)。
firstDate.isBefore(secondDate)
firstDate.isAfter(secondDate)
现在,您可以按正确的顺序设置参数了。
然后,根据需要添加前导减号。
不幸的是,Period
has no method abs()
in comparison with Duration
。
但是,我们可以编写自己的辅助方法,借助 Period::negated()
方法来实现此目的:
public static Period periodAbs(Period period) {
return period.toStandardSeconds().getSeconds() < 0
? period.negated()
: period;
}
此外,如果你不喜欢静态方法,你可以提取这个逻辑来分离 class(我认为这绝对是更好的选择):
public static class AbsPeriod {
private final Period period;
public AbsPeriod(Period period) {
this.period = period;
}
public Period value() {
return period.toStandardSeconds().getSeconds() < 0
? period.negated()
: period;
}
}
完整的可运行示例:
import org.joda.time.DateTime;
import org.joda.time.DurationFieldType;
import org.joda.time.Period;
import org.joda.time.PeriodType;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.PeriodFormatter;
import org.joda.time.format.PeriodFormatterBuilder;
class Scratch {
public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
DateTime firstDate = formatter.parseDateTime("12/11/2001 12:12:12");
DateTime secondDate = formatter.parseDateTime("12/11/2000 12:12:12");
DurationFieldType[] types = {DurationFieldType.days(),
DurationFieldType.hours(),
DurationFieldType.minutes(),
DurationFieldType.seconds()};
Period period = new Period(firstDate, secondDate, PeriodType.forFields(types));
PeriodFormatter periodFormatter = new PeriodFormatterBuilder()
.minimumPrintedDigits(2)
.appendDays().appendSuffix(" Day", " Days").appendSeparator(" ")
.appendHours().appendSuffix("h").appendSeparator(" ")
.appendMinutes().appendSuffix("min").appendSeparator(" ")
.appendSeconds().appendSuffix("sec")
.toFormatter();
System.out.println("original period = " + periodFormatter.print(period));
System.out.println("absolute period = " + periodFormatter.print(new AbsPeriod(period).value()));
}
public static class AbsPeriod {
private final Period period;
public AbsPeriod(Period period) {
this.period = period;
}
public Period value() {
return period.toStandardSeconds().getSeconds() < 0
? period.negated()
: period;
}
}
}
以及此测试片段生成的相应 STDOUT:
original period = -365 Days
absolute period = 365 Days