私は数とTIMEUNITを持つクラスを持っています
public static class Time {
private int number;
private Unit unit;
}
TimeUnitでは、列挙型であります
public enum Unit {
days,
months,
years;
}
時間の可能な値であるので、
[0-Integer.MAX] DAYS
[0-Integer.MAX] MONTHS
[0-Integer.MAX] YEARS
私は今日の日付からの時間マイナスにしたいが、今確認してください、私はそれを達成することができますか。
ここでは例があり、
時間期間が30日である場合、resultedDate = Instant.now() - 30日。
時間期間が15ヶ月である場合、resultedDate = Instant.now() - 450 DAYS
時間期間は2年である場合、resultedDate = Instant.now() - 730 DAYS
私は12ヶ月ではないとして、360日も計算うるう年を考慮する必要があることに気づきました。そのための任意のアイデア?
まず、あなたはそのための時間帯を決定する必要があります。どうして?あなたは(UTC)2019-02-28T23でこのコードを実行していたと言う:00:00Z、あなたは1ヶ月を減算します。結果は、すでに3月1日の上海ではこれとは対照的に1月28上に落下しなければならないので、結果は2月1日に落ちる必要がありますので、この時点でそれは差が3日間(72時間)で、メキシコ市で2月28日のです。
あなたは、時間帯が決まったら、それを使用するのが最も簡単ですZonedDateTime
。あなたはいつもに変換することができますInstant
あまりにも簡単ですつまり、差し引いた後。
例えば:
ZoneId zone = ZoneId.of("Asia/Ashkhabad");
Map<Unit, ChronoUnit> units = Map.of(Unit.days, ChronoUnit.DAYS,
Unit.months, ChronoUnit.MONTHS, Unit.years, ChronoUnit.YEARS);
Time timeToSubtract = new Time(15, Unit.months);
Instant result = ZonedDateTime.now(zone)
.minus(timeToSubtract.getNumber(), units.get(timeToSubtract.getUnit()))
.toInstant();
System.out.println("15 months ago was " + result);
ちょうど今(:06:2019-05-08T07 45Z)を実行しているとき、私はこの出力を得ました:
15ヶ月前2018-02-08T07た:06:45.353746Z
ZonedDateTime.minus
私が使っているという方法が理解ChronoUnit
もちろんなく、あなたのUnit
列挙型、後者を取得するのでので、私たちは、翻訳するために(またはあなたの列挙型が実装しなければならない必要があるTemporalUnit
が、それはやり過ぎだろう)。私は翻訳のためのマップを使用しています。私は、Java 9道マップを初期化しています。あなたは、Java 8の上に残っている場合は、私はそれにいくつかの他の方法を埋めるためにあなたを信頼します。
私のコードでは、私はあなたのことを想定しているTime
クラスは、通常のコンストラクタとゲッターを持っています。
ZonedDateTime
また、当日は、常に24時間ではないことを考慮に入れています。春夏の時間(DST)が始まり、クロックが前方になっている場合たとえば、その日はわずか23時間です。そして、25時間営業のクロックは秋に折り返して。