Java 查找小时之间的持续时间
我想计算两个小时之间的持续时间Java 查找小时之间的持续时间,java,date,time,duration,Java,Date,Time,Duration,我想计算两个小时之间的持续时间 SimpleDateFormat defaultFormat = new SimpleDateFormat("HH:mm"); Date hour1 = defaultFormat.parse(time1); Date hour2 = defaultFormat.parse(time2); duration = (time2.getTime() - time1.getTime()) / (1000*60); //to minutes /* hours= durat
SimpleDateFormat defaultFormat = new SimpleDateFormat("HH:mm");
Date hour1 = defaultFormat.parse(time1);
Date hour2 = defaultFormat.parse(time2);
duration = (time2.getTime() - time1.getTime()) / (1000*60); //to minutes
/* hours= duration/60 (hours) minutes = duration%60 (minutes)
特别是当小时1为“22:15”和小时2为“01:15”时,问题会出现。上述代码保存到“duration=1260”(21小时)
如何才能在没有任何错误的情况下找到两个小时之间的差异?请注意,您可能会遇到夏令时时区转换日期,然后23:00和3:00之间的差异可能是4、3或5小时。 我建议您在Java 7中使用JodaTime和类,或者在Android或任何其他Java应用程序中操作日期和时间时使用我建议您使用的。它比本机Java date类强大得多 以下是使用Joda时间的示例:
DateTime startTime;
DateTime endTime;
Period p = new Period(startTime, endTime);
int hours = p.getHours();
int minutes = p.getMinutes();
功能,而不是bug。
您不恰当地使用日期时间类来表示一天中的某个时间值。此外,您使用的是麻烦的旧类,现在是遗留类,被java.time类取代
仅将类用于时间值,不带日期,也不带时区或偏移量
LocalTime lt = LocalTime.of( "22:15" ) ;
你可以用这门课做数学
只使用一天中的某个时间值的方法是24小时不停地工作,跨越午夜。没有日期的背景,你怎么能期待一个合适的结果?从“22:15”到“01:15”,你是想进入下一天、下一周还是下一年
这个班采取不跨越午夜的方法。LocalTime
的值范围总共为24小时,从00:00
到23:59:59.9999999
。因此,从一个较晚的时间到一个较早的时间的唯一方法是在时间上向后移动到较早的时间点,结果是一个负数
LocalTime start = LocalTime.parse ( "22:15" );
LocalTime stop = LocalTime.parse ( "01:15" );
Duration d = Duration.between ( start , stop );
转储到控制台
System.out.println ( "start/stop: " + start + "/" + stop );
System.out.println ( "d.toString(): " + d );
开始/停止:22:15/01:15
d、 toString():PT-21H
这种输出是标准的
如果要计算时间轴上实际时刻之间的时间跨度,请搜索java.time
、Duration
、Period
、OffsetDateTime
、Instant
、Interval
和“已用”的堆栈溢出。这个话题已经讨论过很多次了
举个简单的例子,让我们在区域中指定一些任意日期,从今年1月23日到24日。结果是经过了三个小时的时间。该结果可能因日期和区域而有所不同,因为异常情况如
zdtStart.toString():2017-01-23T22:15-05:00[美国/蒙特利尔]
zdtStop.toString():2017-01-24T01:15-05:00[美国/蒙特利尔]
d、 toString():PT3H
你看
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,& 该项目现已启动,建议迁移到类 要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是 从哪里获得java.time类
- 后来
- 内置的李>
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
-
- 该项目专门为Android采用了ThreeTen Backport(如上所述)
- 看
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class Main {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
LocalTime startTime = LocalTime.parse("22:15");
LocalTime endTime = LocalTime.parse("01:15");
LocalDateTime startDateTime = today.atTime(startTime);
LocalDateTime endDateTime = today.atTime(endTime);
if (startDateTime.isAfter(endDateTime)) {
endDateTime = endDateTime.with(LocalTime.MIN).plusDays(1).with(endTime);
}
Duration duration = Duration.between(startDateTime, endDateTime);
// Default format
System.out.println(duration);
// Custom format
// ####################################Java-8####################################
String formattedDuration = String.format("%02d:%02d:%02d", duration.toHours(), duration.toMinutes() % 60,
duration.toSeconds() % 60);
System.out.println(formattedDuration);
// ##############################################################################
// ####################################Java-9####################################
formattedDuration = String.format("%02d:%02d:%02d", duration.toHoursPart(), duration.toMinutesPart(),
duration.toSecondsPart());
System.out.println(formattedDuration);
// ##############################################################################
}
}
PT3H
03:00:00
03:00:00
输出:
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class Main {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
LocalTime startTime = LocalTime.parse("22:15");
LocalTime endTime = LocalTime.parse("01:15");
LocalDateTime startDateTime = today.atTime(startTime);
LocalDateTime endDateTime = today.atTime(endTime);
if (startDateTime.isAfter(endDateTime)) {
endDateTime = endDateTime.with(LocalTime.MIN).plusDays(1).with(endTime);
}
Duration duration = Duration.between(startDateTime, endDateTime);
// Default format
System.out.println(duration);
// Custom format
// ####################################Java-8####################################
String formattedDuration = String.format("%02d:%02d:%02d", duration.toHours(), duration.toMinutes() % 60,
duration.toSeconds() % 60);
System.out.println(formattedDuration);
// ##############################################################################
// ####################################Java-9####################################
formattedDuration = String.format("%02d:%02d:%02d", duration.toHoursPart(), duration.toMinutesPart(),
duration.toSecondsPart());
System.out.println(formattedDuration);
// ##############################################################################
}
}
PT3H
03:00:00
03:00:00
从了解有关现代日期时间API的更多信息
- 无论出于何种原因,如果您必须坚持使用Java6或Java7,您可以使用哪个backport将大部分Java.time功能移植到Java6&7
- 如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查并确认