gpt4 book ai didi

java - Joda 时间 不同时间的总和

转载 作者:行者123 更新时间:2023-11-30 08:16:44 25 4
gpt4 key购买 nike

我使用的是joda time 2.7,我需要以LocalTime格式添加几次,忽略TimeZone和toDateTimeToday;

示例:

输入(字符串...次)

01:10 , 01:10 , 01:10 ,

01:10 , 01:10 , 01:10 , 01:10 , 01:10 , 01:10

预期输出(米利斯)

03:30

或者预期产出(米利斯)

07:00

我的想法

import org.joda.time.DateTimeZone;
import org.joda.time.Duration;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

static long sumAccumulatedTimes( long... listTimes ){

Duration duration = Duration.ZERO;
DateTimeZone zone = DateTimeZone.getDefault();
DateTimeFormatter fmt = DateTimeFormat.forPattern("HH:mm");
for (int i = 0; i < listTimes.length; i++) {
duration = duration.plus( listTimes[i] ); // in iteration three, ocurred problems!
}
long convertZone = zone.convertUTCToLocal( duration.getMillis() ); // Adjust TimeZone
System.out.println("Output: " + fmt.print( convertZone ) );
return 0; // ignore !
}




// Call method

DateTimeFormatter fmt = DateTimeFormat.forPattern("HH:mm");
sumAccumulatedTimes(
fmt.parseMillis("01:10"),
fmt.parseMillis("01:10")//, up to here Ok (02:20 ouput), next inconsitent values
// fmt.parseMillis("01:10") // add three parameters, is ocurred problems
);

编辑:更新

由@Meno Hochschild解决

String[] input = { "12:00", "12:10" };
PeriodFormatter parser =
new PeriodFormatterBuilder()
.appendHours().appendLiteral(":")
.appendMinutes().toFormatter();
Period period = Period.ZERO;

for (String s : input) {
period = period.plus(parser.parsePeriod(s));
}

PeriodFormatter printer =
new PeriodFormatterBuilder()
.printZeroAlways().minimumPrintedDigits(2)
//.appendDays().appendLiteral(":") // remove original code
.appendHours().appendLiteral(":")
.appendMinutes().toFormatter();
//System.out.println("duration=" + // remove original code //printer.print(period.normalizedStandard()));
// output: duration=01:00:10

System.out.println("duration="
printer.print(period.normalizedStandard( PeriodType.time() )));
// output: duration= 24:10

其他解决方案,作者:@Dexter :)

private static String sumAccumulatedTimes( String... times ){

DateTimeFormatter fmt = DateTimeFormat.forPattern("HH:mm");
DateTimeZone zone = DateTimeZone.getDefault();
PeriodFormatter pformat = new PeriodFormatterBuilder()
.minimumPrintedDigits(2)
.printZeroAlways()
.appendHours()
.appendLiteral(":")
.appendMinutes()
.toFormatter();

long sum = 0;
for ( String time : times ) {
long parseLong = fmt.parseMillis( time );
sum += zone.convertUTCToLocal( parseLong );
}
Period period = new Period( sum );
return period.toString(pformat);
}

两个解决方案的总和,忽略时区,无限制 24 小时

谢谢。

最佳答案

不要使用DateTimeFormatter来解析持续时间。该格式化程序专为格式化和解析时间点而设计,无法处理任何时间溢出,并且还尝试破坏任何计算的持续时间与时区问题(问题的根本原因)。在我的时区“Europe/Berlin”中,表达式 fmt.parseMillis("01:10") 仅产生 10 分钟 - 而不是 1 小时 10 分钟。

改用持续时间格式化程序。在 Joda-Time 中,这称为 PeriodFormatter:

String[] input = { "01:10", "01:10", "01:10", "01:10", "01:10", "01:10" };
PeriodFormatter pf =
new PeriodFormatterBuilder()
.minimumPrintedDigits(2).printZeroAlways()
.appendHours().appendLiteral(":").appendMinutes().toFormatter();
Period period = Period.ZERO;

for (String s : input) {
period = period.plus(pf.parsePeriod(s));
}

System.out.println("duration=" + pf.print(period.normalizedStandard()));
// output: duration=07:00

OP 评论后更新(修复了处理不当的日期溢出问题):

String[] input = { "12:00", "12:10" };
PeriodFormatter parser =
new PeriodFormatterBuilder()
.appendHours().appendLiteral(":")
.appendMinutes().toFormatter();
Period period = Period.ZERO;

for (String s : input) {
period = period.plus(parser.parsePeriod(s));
}

PeriodFormatter printer =
new PeriodFormatterBuilder()
.printZeroAlways().minimumPrintedDigits(2)
.appendDays().appendLiteral(":")
.appendHours().appendLiteral(":")
.appendMinutes().toFormatter();
System.out.println("duration=" + printer.print(period.normalizedStandard()));
// output: duration=01:00:10

另一种修复方法是使用表达式period.normalizedStandard(PeriodType.time())以便仅使用时钟单位。

关于java - Joda 时间 不同时间的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29548146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com