从负的Joda时间段中删除'-'

问题描述 投票:2回答:2

我有一个关于减去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天-11h -23min -05sec

因此,我想知道是否有一种方法可以使它看起来像这样:-2天11小时23分05秒,整件事前面只有一个'-'。但是使用Joda相关功能。

或者至少是一种方法,告诉我期间是否为负。

我可以使用字符串操作来执行此操作,但似乎有点手工。

谢谢。

java date jodatime subtraction
2个回答
2
投票

您需要比较两个日期。

isAfterisBefore方法按毫秒比较日期(忽略时区)。

firstDate.isBefore(secondDate)
firstDate.isAfter(secondDate)

现在,您可以按正确的顺序设置参数。然后,根据需要添加前导减号。


0
投票

[不幸的是,与Period相比,Period没有方法abs()

但是,我们可以编写自己的帮助方法来借助Duration方法来实现这一目标:

Duration

此外,如果您不喜欢静态方法,则可以将此逻辑提取到单独的类中(在我看来,这绝对是更好的选择:

Period::negated()

完整的可运行示例:

Period::negated()

以及此测试代码片段产生的相应STDOUT:

public static Period periodAbs(Period period) {
    return period.toStandardSeconds().getSeconds() < 0
        ? period.negated()
        : period;
}
© www.soinside.com 2019 - 2024. All rights reserved.