H2DB和Java,近似>两小时的差异

时间:2012-09-24 19:41:59

标签: java sql time h2

我正在开发一个比赛计时系统,对于几个实例,我需要从H2DB中检索一个时间对象。与它的bretheren(或sisteren)一样,时间数据类型相对于1970年1月1日,并以SQL表示'hh:mm:ss'格式,日期默认设置为01-01-1970。它默认映射到'java.sql.Time'对象。作为一个信任的padawan,为了显示目的,我将以下内容编码为单独的小时数。

 if(race.getCutOffTime()!=null){
    long cutOffHour=(race.getCutOffTime().getTime())/(3600000);
    int cutOffMinute=(int)(race.getCutOffTime().getTime()%(60*60*1000));
    System.out.println(cutOffHour+":"+cutOffMinute);
    }
然而,由于这些函数输出了意外的值,例如,我的db中的以下语句给出了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对象

1 个答案:

答案 0 :(得分:2)

java.util.Date 始终 UTC时间。因此,根据您的语言环境,可能会有偏移量。

我听说Joda Time是一个更好的Java API来处理时间问题。

无论如何,问题来自于java.util.Date处理的混合日期以及作为SQL的一部分直接传递的其他日期。

只要您继续使用java.util/sql.Date(并且您没有在数据库内达到峰值)(并且您不更改区域设置),结果将是连贯的。当您尝试将值直接作为文本传递时,问题将开始。所以要么在任何地方都使用Date,要么就像垃圾邮件说的那样,每次使用Date时都要注意将Locale设置为“GMT”(因此内部表示和Date的输出是相同的) 。请注意,这确实包括从DB返回的Date