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
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 Instant
despué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.minus
método que estoy usando entiende ChronoUnit
pero por supuesto no es su Unit
enumeració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 Time
clase tiene constructor y captadores de costumbre.
ZonedDateTime
Tambié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.