我使用joda time 2.7,我需要以LocalTime格式添加几次,忽略TimeZone和toDateTimeToday;
示例:
input(String ... times)
01:10 , 01:10 , 01:10 ,
或
01:10 , 01:10 , 01:10 , 01:10 , 01:10 , 01:10
预期产量(Millis)
03:30
或 预期产量(Millis)
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小时
谢谢。
答案 0 :(得分:1)
请勿使用DateTimeFormatter
来解析持续时间。该格式化程序用于及时格式化和解析点,并且无法处理任何时间溢出,并且还会尝试将任何计算的持续时间与时区问题(问题的根本原因)进行处理。在我的时区&#34;欧洲/柏林&#34;,表达式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())
以仅使用时钟单位。
答案 1 :(得分:0)
你可以添加毫秒。
static long sumAccumulatedTimes(String ... array)
{
long sum = 0;
for (String time : array)
{
sum += new LocalTime(time).getMillisOfDay();
}
return sum;
}
结果将是相同的
<强> UPD 强>
使用Joda API将long转换为字符串
static String millisToString(long millis)
{
long hours = millis / (1000 * 60 * 60);
long minutes = (millis / (1000 * 60)) % 60;
return hours + ":" + (minutes < 10 ? "0" : "") + minutes;
}
答案 2 :(得分:0)
@llya。
现在您的代码解决了这个问题! 但就我而言,它会产生我 使用这个长期的不兼容问题 在其他方法JODA。
e.g。
//87600000
static String parseMillisToTextTime( long time ){
DateTimeFormatter fmt = DateTimeFormat.forPattern("HH:mm");
return fmt.print(time);
} // ouput 21:20
System.out.println( LocalTime.fromMillisOfDay(87600000).toString("HH:mm") );
// output 00:20
LocalTime lt = new LocalTime(87600000);
System.out.println("output: " + lt.toString("HH:mm"));
// output 21:20
让我改变这种方法 有很高的维护负担。
如果你想添加你的 有这些观察的解决方案吗?