Skip to content

Commit 20d6b5c

Browse files
committed
Add roundOff option to TemporalAmountParser.
1 parent 11b56a5 commit 20d6b5c

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

eternalcode-commons-shared/src/main/java/com/eternalcode/commons/shared/time/TemporalAmountParser.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99
import java.time.temporal.TemporalAmount;
1010
import java.util.ArrayList;
1111
import java.util.Collections;
12+
import java.util.HashSet;
1213
import java.util.LinkedHashMap;
1314
import java.util.List;
1415
import java.util.Map;
16+
import java.util.Set;
1517
import java.util.function.Predicate;
1618

1719
/**
@@ -41,6 +43,12 @@ public abstract class TemporalAmountParser<T extends TemporalAmount> {
4143
private static final Map<ChronoUnit, Long> UNIT_TO_NANO = new LinkedHashMap<>();
4244
private static final Map<ChronoUnit, Integer> PART_TIME_UNITS = new LinkedHashMap<>();
4345

46+
private Set<ChronoUnit> roundedUnits = new HashSet<>();
47+
48+
public void roundOff(ChronoUnit unit) {
49+
roundedUnits.add(unit);
50+
}
51+
4452
static {
4553
UNIT_TO_NANO.put(ChronoUnit.NANOS, 1L);
4654
UNIT_TO_NANO.put(ChronoUnit.MICROS, 1_000L);
@@ -276,6 +284,11 @@ public String format(T temporalAmount) {
276284

277285
for (String key : keys) {
278286
ChronoUnit chronoUnit = this.units.get(key);
287+
288+
if (roundedUnits.contains(chronoUnit)) {
289+
continue;
290+
}
291+
279292
Long part = UNIT_TO_NANO.get(chronoUnit);
280293

281294
if (part == null) {

eternalcode-commons-shared/test/com/eternalcode/commons/shared/time/TemporalAmountParserTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,34 @@ void testFormat(int seconds, String expected) {
192192
assertEquals(expected, formatted);
193193
}
194194

195+
@Test
196+
void testRoundOff() {
197+
TemporalAmountParser<Duration> temporalAmountParser = new DurationParser()
198+
.withUnit("s", ChronoUnit.SECONDS)
199+
.withUnit("m", ChronoUnit.MINUTES)
200+
.withUnit("h", ChronoUnit.HOURS)
201+
.withUnit("d", ChronoUnit.DAYS);
202+
temporalAmountParser.roundOff(ChronoUnit.MILLIS);
203+
204+
Duration temporalAmount = Duration.ofDays(1)
205+
.plus(Duration.ofHours(1))
206+
.plus(Duration.ofMinutes(1))
207+
.plus(Duration.ofSeconds(1))
208+
.plus(Duration.ofMillis(500));
209+
210+
String formatted = temporalAmountParser.format(temporalAmount);
211+
assertEquals("1d1h1m1s", formatted);
212+
213+
temporalAmount = Duration.ofDays(1)
214+
.plus(Duration.ofHours(1))
215+
.plus(Duration.ofMinutes(1))
216+
.plus(Duration.ofSeconds(1))
217+
.plus(Duration.ofMillis(499));
218+
219+
formatted = temporalAmountParser.format(temporalAmount);
220+
assertEquals("1d1h1m1s", formatted);
221+
}
222+
195223
@Test
196224
void testNotSupportedChronoUnit() {
197225
TemporalAmountParser<Period> temporalAmountParser = new PeriodParser()

0 commit comments

Comments
 (0)