问题描述
如何获取当前时间戳-使用java.sql.Timestamp; x的周数;
这是我当前的时间戳Timestamp.from(Instant.Now(clock));
x-可以是0-5之间的任何数字
解决方法
看到提供的代码,我建议通过Instant::minus
从Instant
中减去几周。由于Instant::minus
不支持ChronoUnit.WEEKS
,因此我们可以通过将它们乘以7来转换星期数。
如果不选择更改Instant
,我们可以将Timestamp
转换为Instant
,减去后再转换回去:
Timestamp.from(timestamp.toInstant().minus(x * 7L,ChronoUnit.DAYS));
或者,如果您是Optional
s的朋友:
Optional.of(timestamp)
.map(Timestamp::toInstant)
.map(t -> t.minus(x * 7L,ChronoUnit.DAYS))
.map(Timestamp::from);
,
使用本地时间的“直接使用即时”示例:
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之类的东西,而枚举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)
,
要从日历的当前时间中减去x周,您还可以尝试:
日历日历= Calendar.getInstance();
calendar.add(日历.DAY_OF_MONTH,-(7 *无周数))