Count Anzahl der Tage basierend auf kundenspezifischen Zeiteinheit

aMagic:

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

Ole VV:

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 Instantnach 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.minusVerfahren , dass ich verwende versteht ChronoUnitaber natürlich nicht Ihre UnitEnum, 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 TimeKlasse üblichen Konstruktor und Getter hat.

ZonedDateTimeauch 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.

Ich denke du magst

Origin http://43.154.161.224:23101/article/api/json?id=119807&siteId=1
Empfohlen
Rangfolge