現在のタイムスタンプから3週間を引く

Aug 20 2020

java.sql.Timestampを使用して現在のタイムスタンプ-x週数を取得するにはどうすればよいですか。

これは私の現在のタイムスタンプです Timestamp.from(Instant.now(clock));

x-は0から5までの任意の数にすることができます

回答

4 Turing85 Aug 20 2020 at 20:47

提供されたコードを見て、Instantviaから週を引くことをお勧めしますInstant::minus。以来ChronoUnit.WEEKSでサポートされていないInstant::minus、我々は7でそれらを乗じて日に数週間を変換することができます。

変更した場合はInstantオプションではありません、我々は変換できるTimestampInstant、減算、およびコンバートバック:

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

2 DigitShifter Aug 20 2020 at 21:41

現地時間を使用したInstantDirectlyの例の使用:

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)
1 RahulMujnani Aug 20 2020 at 21:25

カレンダーの現在の時刻からx週間を引くには、次のことも試してください。

カレンダーcalendar = Calendar.getInstance();

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