Ich habe eine Klasse mit Nummer und Timeunit
public static class Time {
private int number;
private Unit unit;
}
Timeunit ist eine Enumeration
public enum Unit {
days,
months,
years;
}
So sind die möglichen Werte der Zeit sind
[0-Integer.MAX] DAYS
[0-Integer.MAX] MONTHS
[0-Integer.MAX] YEARS
Ich möchte minus der Zeit ab dem heutigen Datum, aber jetzt sicher, wie kann ich es erreichen.
Hier ist ein Beispiel,
wenn Timeperiod beträgt 30 Tage, dann resultedDate = Instant.now () - 30 Tage.
wenn Timeperiod ist 15 Monate, dann resultedDate = Instant.now () - 450 Tage
wenn Timeperiod ist 2 Jahre, dann resultedDate = Instant.now () - 730 Tage
Ich erkannte, dass ich 12 Monate zu prüfen, nicht als 360 Tage und auch berechnen Schaltjahre. Irgendwelche Ideen für das?
Zuerst müssen Sie für die auf einer Zeitzone entscheiden. Warum? Sagen Sie bitte diesen Code ausgeführt wurden bei (UTC) 2019-02-28T23: 00: 00Z und Sie möchten 1 Monat bis subtrahieren. Zu diesem Zeitpunkt ist es 28. Februar in Mexiko-Stadt, so dass das Ergebnis am Januar fallen 28. Dagegen in Shanghai es bereits ist 1. März, so dass das Ergebnis am Februar fallen 1. Die Differenz 3 Tage (72 Stunden).
Sobald Sie sich auf eine Zeitzone entschieden haben, ist es zu Einsatz am einfachsten ZonedDateTime
. Sie können jederzeit konvertieren Instant
nach Abzug, das einfach zu ist.
Beispielsweise:
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);
Wenn gerade jetzt läuft (2019-05-08T07: 06: 45Z) habe ich diese Ausgabe:
15 Monate war vor 2018-02-08T07: 06: 45.353746Z
Das ZonedDateTime.minus
Verfahren , dass ich verwende versteht ChronoUnit
aber natürlich nicht Ihre Unit
Enum, so da Sie die letztere erhalten, müssen wir (oder Ihre ENUM würde implementieren müssen übersetzen TemporalUnit
, aber das wäre übertrieben). Ich verwende eine Karte für die Übersetzung. Ich Initialisieren der Karte die Java 9 Art und Weise. Wenn Sie immer noch auf Java 8 sind, vertraue ich Sie es auf eine andere Weise zu füllen.
In meinem Code habe ich angenommen , dass Ihre Time
Klasse üblichen Konstruktor und Getter hat.
ZonedDateTime
auch berücksichtigt, dass ein Tag nicht immer 24 Stunden. Wenn zum Beispiel im Frühjahr Sommerzeit (DST) beginnt und die Uhren vorwärts gedreht wird, ist der Tag nur 23 Stunden. Und dann 25 Stunden am Tag werden die Uhren im Herbst zurückgedreht.