4

java.sql.Timestamp1時間前に対応する値が必要です。ここでいくつかの日付関連のことが起こっているので、現在の時刻が1回だけサンプリングされ、残りのコードが同じ時刻を使用することが重要です。Timestampミリ秒単位の現在の時間に基づいてを設定する限り。

カレンダーに時間を加算したり減算したりして変更する必要があるため、オブジェクトの操作はCalendar非常に扱いにくいようです。そのため、最初に自分でコピーを複製するか、その値を切り替えることができます。

4

5 に答える 5

8

タイムスタンプを作成するときに、現在の時刻から1時間をミリ秒単位で引くだけです(1時間= 60 * 60 * 1000ミリ秒)

Timestamp oneHourAgo = new Timestamp(System.currentTimeMillis() - (60 * 60 * 1000));
于 2012-08-06T18:55:55.323 に答える
5

tl; dr

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 );

これらのクラスは不変オブジェクトのパターンに従うことに注意してください。オブジェクト内の値の一部を変更(「変更」)するのではなく、元のオブジェクトの値に基づいて新しいオブジェクトがインスタンス化されます。したがって、別の回答で説明されている副作用に問題はありません。そして自動的にスレッドセーフ

于 2016-09-17T21:56:56.057 に答える
1

次のような関数を使用できます。

Timestamp subtractOneHour(Timestamp stamp)
{
    long current = stamp.getTime();
    long substracted = current - 60 * 60 * 1000;
    return new Timestamp(substracted);
}
于 2012-08-06T19:00:49.853 に答える
0

このスレッドをチェックしてください:Javaタイムスタンプ-2007年9月23日付けのタイムスタンプを作成するにはどうすればよいですか?

現在の時刻が1回だけサンプリングされ、残りのコードが同じ時刻を使用することが重要です。

変数に時間を割り当ててから、同じ変数を再利用することをお勧めします。

于 2012-08-06T18:57:50.407 に答える
0

オブジェクトをいじる以外に、いくつかのオプションがありCalendarます-

  1. Apache Date Utilitiesを使用します。これは、基本的にCalendar(必要に応じて)混乱しますが、新しいDateオブジェクト(つまり、スレッドセーフ)を返します。
  2. 日付/時刻の処理にはJodaTimeを使用します。これは通常、全体としてより優れたライブラリと見なされます。
于 2012-08-06T19:04:25.990 に答える