有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

共 (3) 个答案

  1. # 1 楼答案

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

        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());
    
  2. # 2 楼答案

    爪哇。时间

    你说过你不想使用库类,只想使用java.sql.Time。对于你和其他阅读本文的人,我建议你不要使用Time类。第一,这门课已经过时很久了,第二,这门课的设计糟糕透顶,第三,这门课对你来说是错误的,第四,我不相信它可以用于这个目的。你可能会从Amine ABBAOUI的答案中得到这样的印象,即它是可能的,但这个答案在两个方面是欺骗的:它使用的方法已经被弃用了23年半,我建议任何人都不应该这样做;它在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对象

    如果从一个将开始时间和持续时间存储为time数据类型(这是不正确的)的SQL数据库中获取java.sql.Time对象,并且无法控制数据库设计:从数据库中获取LocalTime对象。将duration转换为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);
        }
    

    由于LoalTimeTime相对的LoalTime没有连接到任何时区,上面的转换将为您提供预期的结果

    如果你不想使用java。时间

    如果你不想使用java。时间(不是我能理解的),我最好的建议是你用手做所有事情,不要使用任何图书馆课程。这不是我推荐的解决方案,这不是一个好的解决方案,但它并不像试图让过时的、设计糟糕的Time类以它从未被设计过的方式运行那样糟糕

    你的代码出了什么问题

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

    链接

    解释如何使用java。时间到了

  3. # 3 楼答案

    这似乎是个问题

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