我想在不使用任何其他库(java.date,LocalTime..(的情况下添加两次(java.sql.Time(,时间总是在1小时以下。
java.sql.Time
Time heureDebut="09:00:00";
Time heureFin="00:15:00";
long heureDebuts = heureDebut.getTime()+heureFin.getTime();
Time tt = new Time(heureDebuts);
//I get 08:15:00 as a result
java.time
您说过不想使用库类,只想使用java.sql.Time
。对于您和其他阅读本文的人,我建议您不要使用Time
类。第一,这个类已经过时很久了,第二,这个类设计得很糟糕,第三,它不适合你的目的,第四,我根本不相信它可以用来做这件事。你可能会从Amine ABBAOUI的回答中得到这样的印象:是可能的,但这个答案在两个方面是作弊的:它使用的方法已经被弃用了23年半,我建议任何人都不应该这样做;它在CCD_ 3类之外完成所有的工作。
使用java.time要好得多。它从Java 8开始就被构建到Java中,并且还被后移植到Java 6和7中。
我并不完全清楚,但我假设09:00:00
是一个开始时间,00:15:00
是一个持续时间,您想通过将持续时间添加到开始时间来计算结束时间。
LocalTime heureDebut = LocalTime.of(9, 0);
Duration heureFin = Duration.ofMinutes(15);
LocalTime resultat = heureDebut.plus(heureFin);
System.out.println(resultat);
输出为:
09:15
如果从数据库中获取Time
对象
如果您从SQL数据库中获取java.sql.Time
对象,该数据库将开始时间和持续时间都存储为time
数据类型(这是不正确的(,并且您无法控制数据库设计:请从数据库获取LocalTime
对象。将持续时间转换为Duration
对象,然后像以前一样继续。例如:
PreparedStatement stmt = yourDatabaseConnection.prepareStatement(
"select heure_debut, heure_fin from votre_table where id = 4;");
ResultSet rs = stmt.executeQuery();
if (rs.next()) {
LocalTime heureDebut = rs.getObject("heure_debut", LocalTime.class);
LocalTime heureFin = rs.getObject("heure_fin", LocalTime.class);
Duration dur = Duration.ofNanos(heureFin.getLong(ChronoField.NANO_OF_DAY));
LocalTime resultat = heureDebut.plus(dur);
System.out.println(resultat);
}
由于与Time
相对的LoalTime
没有连接到任何时区,因此上面的转换将为您提供预期的结果。
如果您不想使用java.time
如果您不想使用java.time(我不理解(,我最好的建议是,您可以手工完成所有操作,并且根本不使用任何库类。这不是我推荐的解决方案,也不是一个好的解决方案。但它并不像试图让过时且设计糟糕的Time
类以一种从未设计过的方式运行一样糟糕。
你的代码出了什么问题
除了不能将字符串分配给Time
对象之外,还有一个时区偏移问题。您的时区似乎是1970年1月1日UTC偏移+01:00。Time
是1970年1月1日的java.util.Date
。虽然没有很好的记录,但时间在JVM的默认时区中。因此,您所在时区的09:00:00
与08:00:00UTC相同。00:15:00
是前一天晚上(1969年12月31日(的23:15:00。您使用的getTime
方法获取自00:00:00UTC以来的毫秒数。所以在第一种情况下,你得到了8小时的毫秒,在第二种情况下你得到了一个负数,等于减去四分之三小时。你加上了这些,得到了足够7小时15分钟的毫秒。您将这些反馈到Time
对象中,得到07:15:00UTC,在您的时区打印为08:15:00。
链接
Oracle教程:日期时间解释如何使用java.Time.
您可以按如下方式使用此伪代码:
Time heureDebut= Time.valueOf("01:00:00");
Time heureFin=Time.valueOf("00:15:00");
int hours = heureDebut.getHours() + heureFin.getHours();
int minutes = heureDebut.getMinutes() +heureFin.getMinutes();
int seconds = heureDebut.getSeconds()+heureFin.getSeconds();
if (seconds >= 60) {
minutes =minutes+1;
seconds = seconds % 60;
}
if (minutes >= 60) {
hours =hours+1;
minutes = minutes % 60;
}
Time result=new Time(hours,minutes,seconds);
System.out.println(result.toString());
这似乎是Daylight Saving Time
问题。
Time base = Time.valueOf("09:00:00");
Time additional = Time.valueOf("00:15:00");
long additionalTime = additional.getTime() - additional.getTimezoneOffset()*60*1000;
System.out.println(new Time(base.getTime() + additionalTime));