在JAVA中添加了两次



我想在不使用任何其他库(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));

相关内容

  • 没有找到相关文章

最新更新