在JAVA中添加两次
我想在不使用任何其他库(java.date、LocalTime…)的情况下添加两次(java.sql.Time),我得到的时间总是在1小时以下在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.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结束了?然后你想加上这两次?如果这有任何意义,请解释一下,因为对我来说没有。