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

标签 java sql time h2

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

更改此语句以反射(reflect)时间“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 进行所有操作(并且不在数据库内达到峰值)(并且不更改区域设置),结果将是相干。当您的 SQL 尝试将值直接作为文本传递时,问题就会开始。因此,要么在任何地方使用 Date,要么,正如垃圾神所说,每次使用 Date 时,您都要将区域设置设置为“GMT”(因此内部表示和输出日期相同)。请注意,这确实包括从数据库返回的Date

关于java - H2DB和Java,大约>两个小时的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12571769/

相关文章:

java - 使用ArrayList存储价格表的问题

Mysql 表连接本身

sql - 当条件意外地显着降低性能时

random - 如何在JMeter中的页面请求之间添加不同的时间延迟?

java - 为什么 Spring 4 不能正确地计算出这些泛型?

java - 整数的 hashCode 的最佳实现是什么?

sql - 在TSQL中,如何计算表达式并将其分配给BIT字段?

linux - 如何加速 Linux 内核编译?

time - 更改小时格式 gnuplot (减去 12 小时)

java - 获取错误消息 "the method asList(string[]) is undefined for the type arrays"