6

データベースから日付と時刻を取得しています。それらは別々のフィールドに格納されていますが、日付/時刻を適切に反映する java.util.Date オブジェクトに結合したいと考えています。

これが私の元のアプローチですが、欠陥があります。私は常に、本来あるべき日付/時刻から 6 時間ずれた日付/時刻になってしまいます。これは、Time には Date と同様にタイムゾーン オフセットがあり、タイムゾーン オフセットが必要なのはそのうちの 1 つだけであるためだと思います。

正しい日付/時刻が得られるようにこれを行う方法に関する提案はありますか?

import java.sql.Time;
import java.util.Calendar;
import java.util.Date;

import org.apache.commons.lang.time.DateUtils;
    public static Date combineDateTime(Date date, Time time)
        {
            if (date == null)
                return null;
            Date newDate = DateUtils.truncate(date, Calendar.DATE);
            if (time != null)
            {
                Date t = new Date(time.getTime());
                newDate = new Date(newDate.getTime() + t.getTime());
            }
            return newDate;
        }
4

4 に答える 4

10

Date と Time の両方を Calendar オブジェクトに入れ、さまざまな Cal​​endar メソッドを使用して 2 番目のオブジェクトから時刻の値を抽出し、最初のオブジェクトに入れます。

  Calendar dCal = Calendar.getInstance();
  dCal.setTime(date);
  Calendar tCal = Calendar.getInstance();
  tCal.setTime(time);
  dCal.set(Calendar.HOUR_OF_DAY, tCal.get(Calendar.HOUR_OF_DAY));
  dCal.set(Calendar.MINUTE, tCal.get(Calendar.MINUTE));
  dCal.set(Calendar.SECOND, tCal.get(Calendar.SECOND));
  dCal.set(Calendar.MILLISECOND, tCal.get(Calendar.MILLISECOND));
  date = dCal.getTime();
于 2008-12-05T15:26:16.343 に答える
5

これらのタイプのことを行うときは、Java独自のDateクラスの代わりにJodaTimeを使用してください。これは、あなたがやろうとしているようなことを非常に簡単で信頼できるものにする、はるかに優れた日付/時刻APIです。

于 2008-12-05T15:31:19.750 に答える
4

@ Paul Tomblinはこの問題を確実にコントロールする方法TimeZoneであり、誰かが「JodaTime」をミックスに投入しようとしていることを私は知っていました。他の答えはすべて、次のハックよりも優れており、より堅牢です。

アプリケーションがTimeZoneDBのデフォルトと同じように実行される場合は、次の方法で解決できる可能性があります。

このステップをスキップした場合:

Date t = new Date(time.getTime());

java.sql.Time次のように、値を直接使用します。

newDate = new Date(newDate.getTime() + time.getTime());

デフォルトへの変換はTimeZone導入されません-にjava.sql.Timeは、保存されている値が含まれている必要があります。

YMMV、警告エンプターなど...

于 2008-12-05T15:35:27.213 に答える
1

データベースから読み取られている時間のタイムゾーンがわかっていると仮定すると、ResultSet.getTime(String, Calendar)以前ににタイムゾーンを設定した方法を使用する必要がありますCalendar。JDBCドライバーは、時間に必要な調整を行います。

すべてのコードがサーバーサイドで実行されている場合は、常に共通のタイムゾーン(おそらくUTC)で標準化し、GUIでレンダリングを表示するときに適切に変換することを強くお勧めします。

また、JodaTime(http://joda-time.sourceforge.net)を使用すると、将来の頭痛の種を減らすことができます。

于 2008-12-05T15:33:00.633 に答える