Вычтите 3 недели из текущей временной отметки
Как я могу получить текущую временную метку - x количество недель, используя java.sql.Timestamp;
Это моя текущая отметка времени Timestamp.from(Instant.now(clock));
x- может быть любым числом от 0 до 5
Ответы
Увидев предоставленный код, я бы предложил вычесть недели из Instant
переходного отверстия Instant::minus. Поскольку ChronoUnit.WEEKSне поддерживается Instant::minus
, мы можем преобразовать недели в дни, умножив их на 7.
Если изменение Instant
невозможно, мы можем преобразовать Timestamp
в Instant
, вычесть и преобразовать обратно:
Timestamp.from(timestamp.toInstant().minus(x * 7L, ChronoUnit.DAYS));
Ideone demo
Или, если вы друг Optionals:
Optional.of(timestamp)
.map(Timestamp::toInstant)
.map(t -> t.minus(x * 7L, ChronoUnit.DAYS))
.map(Timestamp::from);
Ideone demo
Пример использования Instant Direct с использованием местного времени:
Instant.now(Clock.systemDefaultZone()).minus(numberOfWeeks * 7L, ChronoUnit.DAYS);
Используется в контексте:
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));
}
Вывод:
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
ЗАМЕТКА:
Почему бы не использовать ChronoUnit.WEEKS напрямую? Смотри ниже:
Instant.now(Clock.systemDefaultZone()).minus(numberOfWeeks, ChronoUnit.WEEKS)
Похоже, что ChronoUnit.WEEKS не поддерживается методом java.time.Instant.minus, в то время как enum ChronoUnit.DAYS поддерживается. При использовании ChronoUnit.WEEKS в методе java.time.Instant.minus выдается следующее исключение:
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)
Чтобы вычесть x недель из текущего времени в календаре, вы также можете попробовать:
Календарь calendar = Calendar.getInstance ();
calendar.add (Calendar.DAY_OF_MONTH, - (7 * no_of_weeks))