web-dev-qa-db-ja.com

Java.sql.Timestampを14日間インクリメントするにはどうすればよいですか?

Sql選択の開始日と終了日の境界としてタイムスタンプを使用するアプリがあります。タイムスタンプを操作するのは本当に難しいと感じていますが、うるう日、時間、秒を考慮していないため、1日を増分するために86,400,000秒を追加することについてあまり気分が良くありません。

13日間23時間59分59秒を追加して、マップの開始日をキーとして週で検索し、開始日を使用して終了日を取得できるようにする予定です。

だから私はこのようなものを取得しようとしています:

Week  startDate              endDate
1     2011-01-03 00:00:00    2011-01-16 23:59:59
2     2011-01-17 00:00:00    2011-01-30 23:59:59

マップの最初の2つの列と、検索後に最後の1つの列が計算されます。 Java.sql.Timestampを安全にインクリメントするにはどうすればよいですか?

24
davidahines

14日は必ずしも14 * 24 * 3600秒ではないことに注意してください。夏時間がある場合、これは1時間短くても長くてもかまいません。歴史的には、それよりもはるかに複雑になる場合があります。

代わりに、JodaTimeまたはCalendarを使用してタイムゾーン依存の計算を実行することをお勧めします。

7
Peter Lawrey
Java.sql.Timestamp ts = ...
Calendar cal = Calendar.getInstance();
cal.setTime(ts);
cal.add(Calendar.DAY_OF_WEEK, 14);
ts.setTime(cal.getTime().getTime()); // or
ts = new Timestamp(cal.getTime().getTime());

これは、デフォルトのタイムゾーンでの夏時間の移行に正しく対応します。必要に応じて、別のタイムゾーンを使用するようにCalendarクラスに指示できます。

47
Adrian Pronk

Java 8

Timestamp old;
ZonedDateTime zonedDateTime = old.toInstant().atZone(ZoneId.of("UTC"));
Timestamp new = Timestamp.from(zonedDateTime.plus(14, ChronoUnit.DAYS).toInstant());
4
Anders B
private Long dayToMiliseconds(int days){
    Long result = Long.valueOf(days * 24 * 60 * 60 * 1000);
    return result;
}

public Timestamp addDays(int days, Timestamp t1) throws Exception{
    if(days < 0){
        throw new Exception("Day in wrong format.");
    }
    Long miliseconds = dayToMiliseconds(days);
    return new Timestamp(t1.getTime() + miliseconds);
}
2
Admir Sabanovic