2

私はレース タイミング システムを開発しています。いくつかのインスタンスで、H2DB から時間オブジェクトを取得する必要があります。兄弟 (または姉妹) と同様に、時間データ型は 1970 年 1 月 1 日を基準とし、SQL では 'hh:mm:ss' 形式で表されます。日付はデフォルトで 01-01-1970 に設定されています。デフォルトでは、「java.sql.Time」オブジェクトにマップされます。信頼できるパダワンとして、表示目的で時と分を区切るために次のようにコーディングしました。

 if(race.getCutOffTime()!=null){
    long cutOffHour=(race.getCutOffTime().getTime())/(3600000);
    int cutOffMinute=(int)(race.getCutOffTime().getTime()%(60*60*1000));
    System.out.println(cutOffHour+":"+cutOffMinute);
    }

ただし、Java の時間処理の悪臭は、これらの関数が予期しない値を出力するという点で発生します。たとえば、私のデータベースからの次のステートメントでは、3:30 の出力が得られます。

INSERT INTO MagEye.Races(RaceName, EventID,CutOffTime) 
VALUES ('TEST', SELECT EventID FROM MagEye.Events 
WHERE EventName='Sabrina Love',TIME '5:50:00');

「0:0:0」の時間を反映するようにこのステートメントを変更すると、「-2:00」の値が得られます。何が間違っていますか? 前もって感謝します)。

編集要求に応じて、データベースのコードは次のとおりです。

テーブル作成ステートメント:

CREATE TABLE IF NOT EXISTS MagEye.Races (RaceID INT PRIMARY KEY AUTO_INCREMENT ,  RaceName VARCHAR(100) ,EventID INT, Description TEXT, MaxEntrants INT, MinAge INT, MaxAge INT, RacePrefix VARCHAR (5), TimingMethod CHAR(1), CutOffTime TIME, RaceEnd TIMESTAMP,Finished BOOLEAN DEFAULT FALSE, Autostart BOOLEAN, FOREIGN KEY(EventID) REFERENCES MagEye.Events(EventID));

挿入ステートメント:

INSERT INTO MagEye.Races(RaceName, EventID,CutOffTime) VALUES ('TEST', SELECT EventID FROM MagEye.Events WHERE EventName='Sabrina Love',TIME '5:50:00');

検索:

raceDB.result = raceDB.state.executeQuery("SELECT * FROM MagEye.Races WHERE EventID=" + eventID + " ORDER BY RaceName");
            java.util.ArrayList<Race> races = new java.util.ArrayList<>();


            while (raceDB.result.next()) {
                Race thisRace;
                String timingMethodString = raceDB.result.getString("TimingMethod");
                Race.TimingMethod timingMethod = null;
                if (timingMethodString != null) {
                    timingMethod = Race.TimingMethod.valueOf(timingMethodString);
                } else {
                    timingMethod = Race.TimingMethod.MANUAL;
                }
                thisRace = new Race(raceDB.result.getInt("RaceID"), event, raceDB.result.getString("RaceName"), raceDB.result.getString("Description"), raceDB.result.getInt("MaxEntrants"), raceDB.result.getInt("MinAge"), raceDB.result.getInt("MaxAge"), raceDB.result.getString("RacePrefix"), timingMethod,(raceDB.result.getTime("CutOffTime")), raceDB.result.getBoolean("Autostart"));
thisRace = new Race(raceDB.result.getInt("RaceID"), event, raceDB.result.getString("RaceName"), raceDB.result.getString("Description"), raceDB.result.getInt("MaxEntrants"), raceDB.result.getInt("MinAge"), raceDB.result.getInt("MaxAge"), raceDB.result.getString("RacePrefix"), timingMethod,(raceDB.result.getTime("CutOffTime")), raceDB.result.getBoolean("Autostart"));

画面:

if(race.getCutOffTime()!=null){
    long cutOffHour=(int)(race.getCutOffTime().getTime())/(3600000);
    RacesCutOffLength.setText(cutOffHour+"");      
    int cutOffMinute=(int)(race.getCutOffTime().getTime()%(60*60*1000));
    this.RacesMinutes.setText(cutOffMinute+"");
    }
    else{
        RacesCutOffLength.setText("0");      
        RacesMinutes.setText("0");      
    }

編集: Time オブジェクトを長いプリミティブに置き換えることにしました

4

1 に答える 1

2

java.util.Date常にUTC時間です。したがって、ロケールによっては、おそらくオフセットがあります。

Joda Time私は、時代に対処するためのより良いJavaAPIとして聞いたことがあります。

java.util.Dateとにかく、問題は、SQLの一部として直接渡された日付と他の日付が混在していることに起因します。

すべてに使用し続けるjava.util/sql.Date(そしてDB内でピークに達しない)(そしてロケールを変更しない)限り、結果は一貫性があります。SQLが値をテキストとして直接渡そうとすると、問題が発生します。したがって、Dateどこでも使用するか、trashgodが言うように、使用するDateたびにロケールを「GMT」に設定するように注意してください(したがって、内部表現と日付の出力は同じです)。Dateこれには、DBから返されたものも含まれることに注意してください

于 2012-09-24T19:49:28.160 に答える