从当前时间戳中减去 3 周

Subtract 3 weeks from current timetamp

如何获取当前时间戳 - x 周数 java.sql.Timestamp;

这是我当前的时间戳Timestamp.from(Instant.now(clock));

x- 可以是 0-5 中的任意数字

看到提供的代码,我建议通过 Instant::minus. Since ChronoUnit.WEEKSInstant 中减去周数 Instant::minus 不支持,我们可以将周数乘以天数与 7.

如果更改 Instant 不是一个选项,我们可以将 Timestamp 转换为 Instant,减去,然后转换回:

Timestamp.from(timestamp.toInstant().minus(x * 7L, ChronoUnit.DAYS));

Ideone demo

或者,如果您是 Optional 的朋友:

Optional.of(timestamp)
    .map(Timestamp::toInstant)
    .map(t -> t.minus(x * 7L, ChronoUnit.DAYS))
    .map(Timestamp::from);

Ideone demo

要从日历的当前时间减去 x 周,您还可以尝试:

日历日历=Calendar.getInstance();

calendar.add(Calendar.DAY_OF_MONTH, - (7 * no_of_weeks))

直接使用即时示例,使用本地时间:

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 支持,而枚举 ChronoUnit.DAYS 受支持。在方法 java.time.Instant.minus 中使用 ChronoUnit.WEEKS 时会抛出以下异常:

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)