Sottrai 3 settimane dall'orario corrente
Come posso ottenere il timestamp corrente - numero x di settimane utilizzando java.sql.Timestamp;
Questo è il mio timestamp attuale Timestamp.from(Instant.now(clock));
x- potrebbe essere qualsiasi numero compreso tra 0 e 5
Risposte
Visto il codice fornito, suggerirei di sottrarre le settimane dal Instant
via Instant::minus. Poiché ChronoUnit.WEEKSnon è supportato da Instant::minus
, possiamo convertire le settimane in giorni moltiplicandole per 7.
Se la modifica di Instant
non è un'opzione, potremmo convertirla Timestamp
in Instant
, sottrarre e riconvertire:
Timestamp.from(timestamp.toInstant().minus(x * 7L, ChronoUnit.DAYS));
Ideone demo
Oppure, se sei un amico di Optionals:
Optional.of(timestamp)
.map(Timestamp::toInstant)
.map(t -> t.minus(x * 7L, ChronoUnit.DAYS))
.map(Timestamp::from);
Ideone demo
Esempio di utilizzo di Instant Direct, utilizzo dell'ora locale:
Instant.now(Clock.systemDefaultZone()).minus(numberOfWeeks * 7L, ChronoUnit.DAYS);
Usato nel contesto:
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));
}
Produzione:
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:
Perché non utilizzare direttamente ChronoUnit.WEEKS? Vedi sotto:
Instant.now(Clock.systemDefaultZone()).minus(numberOfWeeks, ChronoUnit.WEEKS)
Sembra che ChronoUnit.WEEKS non sia supportato dal metodo java.time.Instant.minus mentre enum ChronoUnit.DAYS lo è. Quando si utilizza ChronoUnit.WEEKS nel metodo java.time.Instant.minus, viene generata la seguente eccezione:
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)
Per sottrarre x settimane dall'ora corrente del calendario, puoi anche provare:
Calendar calendar = Calendar.getInstance ();
calendar.add (Calendar.DAY_OF_MONTH, - (7 * no_of_weeks))