Restar 3 semanas de la marca de tiempo actual

Aug 20 2020

¿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

4 Turing85 Aug 20 2020 at 20:47

Al ver el código proporcionado, sugeriría restar las semanas de Instantvia Instant::minus. Como ChronoUnit.WEEKSno es compatible con Instant::minus, podemos convertir las semanas en días multiplicándolas por 7.

Si cambiar el Instantno es una opción, podríamos convertir el Timestampen 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

2 DigitShifter Aug 20 2020 at 21:41

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)
1 RahulMujnani Aug 20 2020 at 21:25

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