首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >H2DB和Java,一个approximate>两小时的偏差

H2DB和Java,一个approximate>两小时的偏差
EN

Stack Overflow用户
提问于 2012-09-24 19:41:59
回答 1查看 498关注 0票数 2

我正在开发一个比赛计时系统,在一些情况下,我需要从H2DB中检索一个time对象。与它的前身(或姐妹)一样,时间数据类型相对于1970年1月1日,并以'hh:mm:ss‘格式以SQL表示,在默认情况下日期设置为01-01-1970。默认情况下,它被映射到'java.sql.Time‘对象。作为一个信任的学徒,我编码了以下几个小时和几分钟,以供展示之用。

代码语言:javascript
复制
 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处理臭味的时间是因为这些函数输出了意想不到的值,例如,来自我的db的以下语句提供了3:30的输出。

代码语言:javascript
复制
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“的值,我做错了什么?谢谢(提前)。

根据请求,编辑,这是我的数据库代码:

表创建语句:

代码语言:javascript
复制
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));

插入语句:

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

检索:

代码语言:javascript
复制
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"));

显示:

代码语言:javascript
复制
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对象

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-24 19:49:28

java.util.Date,总是是UTC时间。因此,取决于您的地区,可能会有一个偏移。

我听说过Joda Time是一个更好的处理时间的Java。

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

只要您继续对任何事情都使用java.util/sql.Date (而不是在DB内部达到峰值)(并且不更改区域设置),结果将是一致的。当SQL试图将值直接作为文本传递时,问题就会开始。所以,要么在任何地方使用Date,要么就像垃圾神说的那样,每次使用Date时,都负责将区域设置为"GMT“(因此内部表示和日期的输出是相同的)。请注意,这包括从DB返回的Date

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12571769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档