H2DB和Java,大约>两个小时的差异

我正在开发一个比赛计时系统,在某些情况下,我需要从H2DB中检索一个时间对象.像其bretheren(或sisteren)一样,time数据类型是相对于1970年1月1日的,并以“ hh:mm:ss”格式用SQL表示,日期默认情况下设置为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);
    }

但是,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对象

解决方法:

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

我听说Joda Time是用于处理时间的更好的Java API.

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

只要您对所有内容始终使用java.util / sql.Date(并且您不会在DB内达到最高峰)(并且不更改语言环境),结果将保持一致.当您的SQL尝试直接将值作为文本传递时,麻烦就开始了.因此,无论在任何地方都使用Date,或者如垃圾桶所说,每次使用Date时,都要注意将Locale设置为“ GMT”(这样,内部表示和Date的输出是相同的).请注意,这确实包括从数据库返回的日期

上一篇:春季-每次运行单元测试时,要清除H2数据库是什么?


下一篇:第八章 Net 5.0 快速开发框架 YC.Boilerplate --全局注入设计