java.sql.Timestamp
1時間前に対応する値が必要です。ここでいくつかの日付関連のことが起こっているので、現在の時刻が1回だけサンプリングされ、残りのコードが同じ時刻を使用することが重要です。Timestamp
ミリ秒単位の現在の時間に基づいてを設定する限り。
カレンダーに時間を加算したり減算したりして変更する必要があるため、オブジェクトの操作はCalendar
非常に扱いにくいようです。そのため、最初に自分でコピーを複製するか、その値を切り替えることができます。
タイムスタンプを作成するときに、現在の時刻から1時間をミリ秒単位で引くだけです(1時間= 60 * 60 * 1000ミリ秒)
Timestamp oneHourAgo = new Timestamp(System.currentTimeMillis() - (60 * 60 * 1000));
mySqlTimestamp.toInstant()
.minus( Duration.ofHours( 1 ) )
java.sqlタイプは、データベースとのデータ交換のみを目的としています。これらをビジネスロジックに使用しないでください。
面倒な古い日時クラスは、java.timeクラスに取って代わられました。に相当するjava.timejava.sql.Timestamp
はですjava.time.Instant
。古いクラスに追加された新しいメソッドを介して、またはから変換することもできます。
Instant instant = mySqlTimestamp.toInstant();
次に、で表される時間を減算できますDuration
。
Duration d = Duration.ofHours( 1 );
Instant hourPrior = instant.minus( d );
これらのクラスは不変オブジェクトのパターンに従うことに注意してください。オブジェクト内の値の一部を変更(「変更」)するのではなく、元のオブジェクトの値に基づいて新しいオブジェクトがインスタンス化されます。したがって、別の回答で説明されている副作用に問題はありません。そして自動的にスレッドセーフ。
次のような関数を使用できます。
Timestamp subtractOneHour(Timestamp stamp)
{
long current = stamp.getTime();
long substracted = current - 60 * 60 * 1000;
return new Timestamp(substracted);
}
このスレッドをチェックしてください:Javaタイムスタンプ-2007年9月23日付けのタイムスタンプを作成するにはどうすればよいですか?
現在の時刻が1回だけサンプリングされ、残りのコードが同じ時刻を使用することが重要です。
変数に時間を割り当ててから、同じ変数を再利用することをお勧めします。
オブジェクトをいじる以外に、いくつかのオプションがありCalendar
ます-
Calendar
(必要に応じて)混乱しますが、新しいDate
オブジェクト(つまり、スレッドセーフ)を返します。