我正在使用Joda Time实施倒计时。我只需要秒的显示精度。
然而,当打印时间时,秒数显示为全秒,因此当倒计时达到例如900ms时,则打印“0”秒,但作为倒计时,显示更有意义“1”秒,直到时间实际达到0ms。
示例:
void printDuration(Duration d) {
System.out.println(
d.toPeriod(PeriodType.time()).toString(
new PeriodFormatterBuilder().printZeroAlways().appendSeconds().toFormatter()
)
);
}
printDuration(new Duration(5000)); // Prints "5" => OK
printDuration(new Duration(4900)); // Prints "4" => need "5"
printDuration(new Duration(1000)); // Prints "1" => OK
printDuration(new Duration(900)); // Prints "0" => need "1"
printDuration(new Duration(0)); // Prints "0" => OK
基本上我需要将显示的秒数从毫秒向上舍入而不是向下舍入。有没有办法用Joda实现这一点而无需编写我自己的格式化程序?
答案 0 :(得分:3)
最简单的方法是采用现有的持续时间,适当地围绕毫秒来创建新的持续时间,并格式化:
private static Duration roundToSeconds(Duration d) {
return new Duration(((d.getMillis() + 500) / 1000) * 1000);
}
(请注意,这假定为正的持续时间,否则舍入将为奇数。)
答案 1 :(得分:1)
您是否有兴趣仅打印几秒钟的持续时间?
如果没有,您的printDuration
方法错误(它为0
打印Duration(60000)
- 即仅打印秒分数
(顺便说一下,看到格式化程序在每个调用中实例化都让我无法轻松)
如果是,(或者如果您对打印“3600”的持续时间为1小时感到满意)您实际上不需要时间智能,那么自己进行格式化会更简单:
static void printDuration(Duration d) {
int secs = (int)((d.getMillis()+999)/1000);
System.out.println(secs);
}
正如乔恩所指出的,这只适用于积极的持续时间。
答案 2 :(得分:0)
import java.math.BigDecimal;
private Duration round(Duration d) {
return Duration.standardSeconds(new BigDecimal(d.getMillis()).divide(1000, 0, BigDecimal.ROUND_up));
}
然后:
void printDuration(Duration d) {
System.out.println(
round(d).toPeriod(PeriodType.time()).toString(
new PeriodFormatterBuilder().printZeroAlways().appendSeconds().toFormatter()
)
);
}