在JAVA中添加两次

在JAVA中添加两次,java,date,time,duration,timeofday,Java,Date,Time,Duration,Timeofday,我想在不使用任何其他库(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(heureDebut

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

您可以按如下方式使用此伪代码:

    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());

这似乎是夏令时问题

Time base=Time.valueOf(“09:00:00”);
附加时间=时间值(“00:15:00”);
long additionalTime=additional.getTime()-additional.getTimezoneOffset()*60*1000;
System.out.println(新时间(base.getTime()+additionalTime));
java.time 您说过您不想使用库类,只想使用
java.sql.Time
。对于您和阅读本文的其他人,我建议您不要使用
时间
类。第一,这门课已经过时很久了,第二,这门课设计得很糟糕,第三,这门课对你来说是错误的,第四,我根本不相信它可以用于这个目的。你可能会从阿明·阿鲍伊的回答中得到这样的印象:这是可能的,但这个答案在两个方面是欺骗的:它使用的方法已经被弃用了23年半,我建议任何人都不应该这样做;它在
时间
课程之外做所有的工作

使用java.time更方便。从Java8开始,它就被内置到Java中,并且也被后移植到Java6和Java7中

我并不十分清楚,但我假设
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
datatype(这是不正确的),并且您无法控制数据库设计:从数据库获取
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);
    }
由于与时间相对的
LoalTime
未连接到任何时区,因此上面的转换将为您提供预期的结果

如果您不想使用java.time 如果您不想使用java.time(我不明白这一点),我的最佳建议是您手工完成所有工作,并且根本不使用任何库类。这不是我推荐的解决方案,这不是一个好的解决方案,但它并不像试图让过时且设计糟糕的
Time
类以一种它从未设计过的方式运行那样糟糕

你的代码出了什么问题? 除了不能将字符串指定给
Time
对象之外,还存在时区偏移问题。您的时区似乎是1970年1月1日UTC偏移量+01:00。时间是1970年1月1日的
java.util.Date
。虽然没有很好的文档记录,但时间在JVM的默认时区中。因此,您所在时区的
09:00:00
与UTC 08:00:00相同。而
00:15:00
是前一天晚上(1969年12月31日)的23:15:00。您使用的
getTime
方法获取UTC 00:00:00之后的毫秒数。所以在第一种情况下,你得到的是8小时的毫秒,在第二种情况下,你得到的是一个负数,等于负四分之三小时。你加上这些,得到了足够7小时15分钟的毫秒数。您将这些信息反馈到
Time
对象中,得到UTC 07:15:00,在您的时区中打印为08:15:00

链接
解释如何使用java.time。

你检查过java本身的时间库吗?是的,我现在使用getTime(),但问题是小时总是在1小时以内。我强烈建议你不要使用
java.sql.time
。该类是对已经设计得很糟糕的
java.util.Date
类的攻击,并且早已过时。在使用时,它只适用于一天中的某个时间段,而不适用于某个时间段,例如持续时间。对于一天中的一段时间使用
LocalTime
,对于一段时间使用
Duration
,两者都是从。如果我的法语(我相信是这样的),事情从9:00开始,但它已经在晚上0:15结束了?然后你想加上这两次?如果这有任何意义,请解释一下,因为对我来说没有。