我正在开发一个比赛计时系统,在某些情况下,我需要从H2DB中检索一个时间对象。像其bretheren(或sisteren)一样,time数据类型是相对于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); }
但是,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));
插入声明:
恢复:
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时间。因此,根据您的语言环境,可能会有偏移。
java.util.Date
我听说过Joda Time作为处理时间的更好的Java API。
Joda Time
无论如何,问题出在混合由java.util.DateSQL 处理的日期和其他直接作为SQL一部分传递的日期。
只要您继续使用java.util/sql.Date所有内容(并且您不会在数据库内部达到顶峰)(并且您不更改语言环境),结果就会保持一致。当您的SQL尝试直接将值作为文本传递时,麻烦就开始了。因此,无论是Date在各处使用,还是如垃圾桶所说的,每次使用a时Date,都要注意将语言环境设置为“ GMT”(这样内部表示形式和Date的输出是相同的)。请注意,这确实包括Date从数据库返回的信息
java.util/sql.Date
Date