Contar el número de días basado en la unidad de tiempo personalizado

aMagic:

Tengo una clase con número y unidadTiempo

public static class Time {
    private int number;
    private Unit unit;
}

TimeUnit es una enumeración

public enum Unit {
    days,
    months,
    years;
}

Por lo que los posibles valores de tiempo son

[0-Integer.MAX] DAYS
[0-Integer.MAX] MONTHS
[0-Integer.MAX] YEARS

Quiero menos el tiempo desde la fecha de hoy, pero ahora segura de lo que puedo lograrlo.

Aquí hay un ejemplo,

si TimePeriod es de 30 días, y luego resultedDate = Instant.now () - 30 días.

si TimePeriod es de 15 meses, y luego resultedDate = Instant.now () - 450 días

si TimePeriod es de 2 años, entonces resultedDate = Instant.now () - 730 días

VV Ole:

Me di cuenta de que debo tener en cuenta los 12 meses, no como 360 días y también calcular los años bisiestos. ¿Alguna idea para que?

En primer lugar usted necesita para decidir sobre una zona de tiempo para eso. ¿Por qué? Digamos que estaba ejecutando el código al (UTC) 2019-02-28T23: 00: 00Z y desea restar 1 mes. En este punto en el tiempo es 28 de febrero en la Ciudad de México, por lo que el resultado debe encontrarse el 28 de enero por el contrario en Shanghai ya es 1 de marzo por lo que el resultado debe encontrarse el 1 de febrero La diferencia es de 3 días (72 horas).

Una vez que haya decidido sobre una zona horaria, es más fácil de usar ZonedDateTime. Siempre se puede convertir a Instantdespués de restar, que es sencillo también.

Por ejemplo:

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

Cuando se ejecuta este momento (2019-05-08T07: 06: 45Z) Tengo esta salida:

hace 15 meses fue 2018-02-08T07: 06: 45.353746Z

El ZonedDateTime.minusmétodo que estoy usando entiende ChronoUnitpero por supuesto no es su Unitenumeración, por lo que se obtiene desde este último, tenemos que traducir (o su enumeración tendría que poner en práctica TemporalUnit, pero eso sería una exageración). Estoy usando un mapa para la traducción. Estoy de inicializar el mapa de la forma en que Java 9. Si usted todavía está en Java 8, espero que usted pueda llenar de alguna otra forma.

En mi código he asumido que su Timeclase tiene constructor y captadores de costumbre.

ZonedDateTimeTambién tiene en cuenta que un día no siempre es de 24 horas. Por ejemplo, cuando en el tiempo de primavera y verano (DST) comienza y los relojes se volvió hacia adelante, el día es de sólo 23 horas. Y luego 25 horas del día los relojes se volvió de nuevo en el otoño.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=119825&siteId=1
Recomendado
Clasificación