Restar 3 semanas de la marca de tiempo actual
¿Cómo puedo obtener la marca de tiempo actual? X número de semanas usando java.sql.Timestamp;
Esta es mi marca de tiempo actual Timestamp.from(Instant.now(clock));
x- podría ser cualquier número del 0 al 5
Respuestas
Al ver el código proporcionado, sugeriría restar las semanas de Instant
via Instant::minus. Como ChronoUnit.WEEKSno es compatible con Instant::minus
, podemos convertir las semanas en días multiplicándolas por 7.
Si cambiar el Instant
no es una opción, podríamos convertir el Timestamp
en un Instant
, restar y volver a convertir:
Timestamp.from(timestamp.toInstant().minus(x * 7L, ChronoUnit.DAYS));
Ideone demo
O, si eres amigo de Optionals:
Optional.of(timestamp)
.map(Timestamp::toInstant)
.map(t -> t.minus(x * 7L, ChronoUnit.DAYS))
.map(Timestamp::from);
Ideone demo
Usando el ejemplo de Instant Directly, usando la hora local:
Instant.now(Clock.systemDefaultZone()).minus(numberOfWeeks * 7L, ChronoUnit.DAYS);
Usado en contexto:
public static void main(String[] args) {
Instant now = Instant.now(Clock.systemDefaultZone());
System.out.println("The time right now (local time): " + Timestamp.from(now));
long numberOfWeeks = 3L;
Instant minusXweeks = now.minus(numberOfWeeks * 7L, ChronoUnit.DAYS);
System.out.println("The time 3 weeks before now (local time): " + Timestamp.from(minusXweeks));
}
Salida:
The time right now (local time): 2020-08-20 23:24:58.077223
The time 3 weeks before now (local time): 2020-07-30 23:24:58.077223
NOTA:
¿Por qué no utilizar ChronoUnit.WEEKS directamente? Vea abajo:
Instant.now(Clock.systemDefaultZone()).minus(numberOfWeeks, ChronoUnit.WEEKS)
Parece que ChronoUnit.WEEKS no es compatible con el método java.time.Instant.minus mientras que enum ChronoUnit.DAYS sí lo es. Cuando se usa ChronoUnit.WEEKS en el método java.time.Instant.minus, se lanza la siguiente excepción:
Exception in thread "main" java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Weeks
at java.base/java.time.Instant.plus(Instant.java:861)
at java.base/java.time.Instant.minus(Instant.java:978)
at TestClass.main(TestClass.java:18)
Para restar x semanas de la hora actual del calendario, también puede intentar:
Calendar calendar = Calendar.getInstance ();
calendar.add (Calendar.DAY_OF_MONTH, - (7 * no_of_weeks))