Skip to content

Commit b15dab6

Browse files
committed
Expand time API
1 parent 3bc8658 commit b15dab6

File tree

3 files changed

+61
-25
lines changed

3 files changed

+61
-25
lines changed

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

Lines changed: 41 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -295,33 +295,15 @@ public ChronoUnit getUnit() {
295295
}
296296
}
297297

298-
/**
299-
* Formats the given estimated temporal amount to a string.
300-
* <p>
301-
* Examples:
302-
* </p>
303-
* <ul>
304-
* <li>Duration of 30 seconds: {@code 30s}</li>
305-
* <li>Duration of 25 hours: {@code 1d1h}</li>
306-
* <li>Duration of 1 year, 2 months, 3 weeks, 4 days, 5 hours, 6 minutes and 7 seconds: {@code 1y2mo3w4d5h6m7s}</li>
307-
* <li>Duration of 1 hours and 61 minutes: {@code 2h1m}</li>
308-
* <li>Past duration of 1 hours and 61 minutes: {@code -2h1m}</li>
309-
* <li>Period of 1 year, 2 months, 4 days: {@code 1y2mo4d}</li>
310-
* <li>Past period of 1 year, 2 months, 4 days: {@code -1y2mo4d}</li>
311-
* </ul>
312-
*
313-
* @param temporalAmount the temporal amount to format. Must not be null.
314-
* @return the formatted string
315-
*/
316-
public String format(T temporalAmount) {
317-
StringBuilder builder = new StringBuilder();
298+
public TimeResult prepare(T temporalAmount) {
299+
List<TimePart> parts = new ArrayList<>();
318300
Duration duration = this.toDuration(this.baseForTimeEstimation, temporalAmount);
319301
for (TimeModifier modifier : this.modifiers) {
320302
duration = modifier.modify(duration);
321303
}
322304

305+
boolean isNegative = duration.isNegative();
323306
if (duration.isNegative()) {
324-
builder.append('-');
325307
duration = duration.negated();
326308
}
327309

@@ -345,18 +327,52 @@ public String format(T temporalAmount) {
345327

346328
BigInteger nanosCountCleared = count.multiply(nanosInOneUnit);
347329

348-
builder.append(count).append(key);
330+
parts.add(new TimePart(count, key, unit));
349331
duration = duration.minusNanos(nanosCountCleared.longValue());
350332
}
351333

352-
String result = builder.toString();
334+
return new TimeResult(parts, isNegative);
335+
}
353336

354-
if (result.isEmpty()) {
337+
/**
338+
* Formats the given estimated temporal amount to a string.
339+
* <p>
340+
* Examples:
341+
* </p>
342+
* <ul>
343+
* <li>Duration of 30 seconds: {@code 30s}</li>
344+
* <li>Duration of 25 hours: {@code 1d1h}</li>
345+
* <li>Duration of 1 year, 2 months, 3 weeks, 4 days, 5 hours, 6 minutes and 7 seconds: {@code 1y2mo3w4d5h6m7s}</li>
346+
* <li>Duration of 1 hours and 61 minutes: {@code 2h1m}</li>
347+
* <li>Past duration of 1 hours and 61 minutes: {@code -2h1m}</li>
348+
* <li>Period of 1 year, 2 months, 4 days: {@code 1y2mo4d}</li>
349+
* <li>Past period of 1 year, 2 months, 4 days: {@code -1y2mo4d}</li>
350+
* </ul>
351+
*
352+
* @param temporalAmount the temporal amount to format. Must not be null.
353+
* @return the formatted string
354+
*/
355+
public String format(T temporalAmount) {
356+
TimeResult result = this.prepare(temporalAmount);
357+
if (result.parts().isEmpty()) {
355358
String defaultSymbol = this.defaultZeroSymbol.get();
356359
return "0" + defaultSymbol;
357360
}
358361

359-
return result;
362+
StringBuilder builder = new StringBuilder();
363+
if (result.isNegative()) {
364+
builder.append('-');
365+
}
366+
367+
for (TimePart part : result.parts()) {
368+
if (part.count().equals(BigInteger.ZERO)) {
369+
continue;
370+
}
371+
372+
builder.append(part.count()).append(part.name());
373+
}
374+
375+
return builder.toString();
360376
}
361377

362378
protected abstract Duration toDuration(LocalDateTimeProvider baseForTimeEstimation, T temporalAmount);
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.eternalcode.commons.time;
2+
3+
import java.math.BigInteger;
4+
import java.time.temporal.ChronoUnit;
5+
6+
public record TimePart(
7+
BigInteger count,
8+
String name,
9+
ChronoUnit unit
10+
) {
11+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.eternalcode.commons.time;
2+
3+
import java.util.List;
4+
5+
public record TimeResult(
6+
List<TimePart> parts,
7+
boolean isNegative
8+
) {
9+
}

0 commit comments

Comments
 (0)