Javaでの時間ベースのトークンを解析するには?(1M 1M 1D 1Y 1W 1S)

gstackoverflow:

私はFEから文字列を取得します以下:

1m
5M
3D
30m
2h
1Y
3W

これは、1分、5ヶ月、3日間、30分、2時間、1年、3週間に対応しています。

それを解析するためにJavaであり意味ですか?

私はインスタント(またはLocalDatetTime)と(追加/マイナス)を操作したいです。Javaでそれを行う方法はありますか?

オレVV:

PeriodDuration

私は、次のソリューションのシンプルで(完全には一般的ではない)、かなり一般的に検討してください。

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);
    }
}

あなたの日付ベースの単位(年、月、週、日)は大文字の省略形(で表されているようですYMWおよびD時間ベースのもの(時間と分)を小文字(されている間)hm)。私は、文字列の最後の文字のケースをテストするように解析するかどうかを決定しますPeriodDuration私は両方の事実エクスプロイトPeriod.parseとは、Duration.parseいずれの場合も、文字を受け入れるを。

あなたは、にしてからの期間を加算または減算したかったですInstantLocalDateTimeこれはで動作し、ほとんどの場合。どれどれ:

    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、ほとんどの場合、作品、唯一の我々はそれに数ヶ月または数年の期間を追加することはできません。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=196731&siteId=1