gstackoverflow:
私はFEから文字列を取得します以下:
1m
5M
3D
30m
2h
1Y
3W
これは、1分、5ヶ月、3日間、30分、2時間、1年、3週間に対応しています。
それを解析するためにJavaであり意味ですか?
私はインスタント(またはLocalDatetTime)と(追加/マイナス)を操作したいです。Javaでそれを行う方法はありますか?
オレVV:
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
、ほとんどの場合、作品、唯一の我々はそれに数ヶ月または数年の期間を追加することはできません。