【问题标题】:Subtract 3 weeks from current timetamp从当前时间戳中减去 3 周
【发布时间】:2020-12-10 05:56:35
【问题描述】:

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

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

x- 可以是 0-5 之间的任何数字

【问题讨论】:

标签: java timestamp sql-timestamp


【解决方案1】:

看到提供的代码,我建议通过Instant::minusInstant 中减去周数。由于Instant::minus 不支持ChronoUnit.WEEKS,因此我们可以通过将周数乘以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

【讨论】:

  • 为什么它给我:java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Weeks
  • Timestamp.from(timestamp.toInstant().minus((line.hashCode() % 4) * 7L, ChronoUnit.WEEKS)) 我仍然看到 UnsupportedTemporalTypeException。这是我使用的代码
  • 这个答案假设一周总是 7 乘以 24 小时(168 小时),这在现实生活中并不总是如此,或者更准确地说,在实时区域中并不总是如此。
【解决方案2】:

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

似乎方法 java.time.Instant.minus 不支持 ChronoUnit.WEEKS 而 enum 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)

【讨论】:

    【解决方案3】:

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

    日历日历 = Calendar.getInstance();

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-16
      • 2020-06-02
      • 1970-01-01
      相关资源
      最近更新 更多