2011-09-16 15 views
14

私は、SQL選択の開始日と終了日の境界としてタイムスタンプをとるアプリケーションを持っています。今年の最初の月曜日から値と週番号までの週をハッシュマップに設定したいキー。私はタイムスタンプを扱うのが本当に難しいと思っていますし、うるう日、時間、秒を考慮していないので、日にちを増やすために86,400,000秒を追加することについて非常に良い気がしません。java.sql.Timestampを14日間増分するにはどうすればよいですか?

私は23時間59分59秒の13日を追加して、週のキーで地図の開始日を検索し、開始日を使用して終了日を取得する予定です。

だから私はこのような何かを取得しようとしているよ:地図での最初の2列とそれを見た後に計算された最後のもので

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 

を。どうすれば安全にjava.sql.Timestampをインクリメントできますか?

+0

あなたが心配する必要があるだろう唯一の問題は、うるう秒で、それらは数年ごとに一度起こります。プログラムが1970年以降に実行されていた場合は、合計24秒で終了します。 86.4M秒を追加するあなたの計画は完全に実行可能です。 – corsiKa

+0

カレンダーやJodaを使って作業することはどうですか? http://joda-time.sourceforge.net/ –

+0

私はあなたのアプリのブロッカーとしてこれを特定したのですか?あなたがいない場合は、ちょうどそれと一緒に行く。それが問題であれば、それ自体を提示し、あなたはそれに取り組むことができます。 – corsiKa

答えて

7

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

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

+1

それは本当に重要でしょうか? UTCを使用している限り、この問題は発生しません。 – corsiKa

+1

SQLではほとんどがUTCを使用していません。特に明示的にmetntionしていない場合。 –

+0

GMTや夏時間のないタイムゾーンを使用している場合は問題ありません。私は14日に24時間を含まない日が含まれている可能性があることを旗にしたいと思いました。 JavaはGMTのようなうるう秒をサポートしませんが、UTCはサポートしていません。 ;) –

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

これは、デフォルトのタイムゾーンでの昼間のトランジションを正しく調整します。必要に応じて、カレンダークラスに異なるタイムゾーンを使用するように指示できます。

+0

これは、VMに更新されたリスティングがある場合にのみ、夏時間を正しく考慮します。 JodaTimeはこれに標準ソースを使用することができます。これについてのVMアップデートは歴史的に遅かったようです。 –

+1

私は遅いアップデートの1つの理由は、 "エンターテイメント"ユーザーが少なくとも10歳のjvmsにとどまっていることだと思っています...一方、ほとんどのOSは、すべての情報が含まれているタイムゾーン情報のリストを保持できます必要です。 jreは実際にそれを使用する必要があります。私のlinuxラップトップでは、2499年までセットアップされているようだ... – KarlP

2
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); 
} 
1

のJava 8

Timestamp old; 
ZonedDateTime zonedDateTime = old.toInstant().atZone(ZoneId.of("UTC")); 
Timestamp new = Timestamp.from(zonedDateTime.plus(14, ChronoUnit.DAYS).toInstant()); 
関連する問題