Period
& Duration
Я считаю следующее решение простым и довольно общим (не полностью общим).
public static TemporalAmount parse(String feString) {
if (Character.isUpperCase(feString.charAt(feString.length() - 1))) {
return Period.parse("P" + feString);
} else {
return Duration.parse("PT" + feString);
}
}
Похоже, ваши основанные на дате единицы (год, месяц, неделя, день) обозначаются сокращениями в верхнем регистре (Y
, M
, W
и D
), а основанные на времени (часы и минуты) строчными (h
и m
)).Поэтому я проверяю регистр последнего символа строки, чтобы решить, нужно ли анализировать Period
или Duration
.Я использую тот факт, что оба из Period.parse
и Duration.parse
принимают буквы в любом случае.
Вы хотели добавить или вычесть длительности из Instant
или LocalDateTime
.Это работает в большинстве случаев.Давайте посмотрим:
String[] timeAmountStrings = { "1m", "5M", "3D", "30m", "2h", "1Y", "3W" };
LocalDateTime base = LocalDateTime.of(2019, Month.MARCH, 1, 0, 0);
for (String tas : timeAmountStrings) {
TemporalAmount amount = parse(tas);
System.out.println("String: " + tas + " parsed: " + amount + " added: " + base.plus(amount));
try {
System.out.println("Added to Instant: " + Instant.EPOCH.plus(amount));
} catch (DateTimeException dte) {
System.out.println("Adding to Instant didn’t work: " + tas + ' ' + dte);
}
System.out.println();
}
Вывод:
String: 1m parsed: PT1M added: 2019-03-01T00:01
Added to Instant: 1970-01-01T00:01:00Z
String: 5M parsed: P5M added: 2019-08-01T00:00
Adding to Instant didn’t work: 5M java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Months
String: 3D parsed: P3D added: 2019-03-04T00:00
Added to Instant: 1970-01-04T00:00:00Z
String: 30m parsed: PT30M added: 2019-03-01T00:30
Added to Instant: 1970-01-01T00:30:00Z
String: 2h parsed: PT2H added: 2019-03-01T02:00
Added to Instant: 1970-01-01T02:00:00Z
String: 1Y parsed: P1Y added: 2020-03-01T00:00
Adding to Instant didn’t work: 1Y java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Years
String: 3W parsed: P21D added: 2019-03-22T00:00
Added to Instant: 1970-01-22T00:00:00Z
Мы видим, что добавление к LocalDateTime
работает во всех случаях.Добавление к Instant
работает в большинстве случаев, только мы не можем добавить к нему период месяцев или лет.