我想计算几小时之间的持续时间。
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)
特别是当例如hour1是“22:15”而hour2是“01:15”时会出现问题。上面的代码保存为“duration = 1260”(21小时)。
如何在没有任何错误的情况下找到两小时之间的差异?
答案 0 :(得分:0)
请注意,您可能会遇到夏令时区转换日期,然后23:00和3:00之间的差异可能是4小时,3小时或5小时。 我建议您在Java 7中使用JodaTime Duration和Period类或similar API in Java 8
答案 1 :(得分:0)
我建议您在Android或任何其他Java应用中操作日期和时间时使用Joda-Time。它比本机Java日期类强大得多。
以下是使用Joda-Time的示例:
DateTime startTime;
DateTime endTime;
Period p = new Period(startTime, endTime);
int hours = p.getHours();
int minutes = p.getMinutes();
答案 2 :(得分:0)
您不恰当地使用日期时间类来表示时间值。此外,您正在使用麻烦的旧date-time类,现在是旧的,取而代之的是java.time类。
将LocalTime
类用于仅限时间的值,没有日期且没有时区或偏移量。
LocalTime lt = LocalTime.of( "22:15" ) ;
您可以使用Duration
课程进行数学运算。
Duration d = Duration.of( startLocalTime , stopLocalTime );
使用仅限时间的值的捕获是昼夜不停,越过午夜。没有日期的背景,你怎么能期望一个正确的结果?来自" 22:15"到" 01:15"你是想进入第二天,下一周还是第二年?
Duration
课程采取不跨越午夜的方法。 LocalTime
的值范围总共为二十四小时,从00:00
的{{1}}到23:59:59.999999999
的{{3}}。因此,从较晚时间到较早时间的唯一方法是及时向前行驶到较早点,导致负数。
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
该输出为标准minimum。
如果您想计算时间轴上实际时刻之间的时间跨度,请搜索java.time
,Duration
,Period
,maximum,{{3 }},OffsetDateTime
,Instant
,Interval
和“已过去”。 很多次已经涵盖了这个主题。
作为一个简单的例子,让我们在ISO 8601 format for durations区域分配一些从今年1月23日到24日的任意日期。结果是三小时的经过时间。由于ZonedDateTime
等异常,此结果可能因日期和区域而异。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdtStart = ZonedDateTime.of( 2017, 1, 23, 22, 15, 0, 0 , z );
ZonedDateTime zdtStop = ZonedDateTime.of( 2017, 1, 24, 01, 15, 0, 0 , z );
Duration d = Duration.between( zdtStart , zdtStop );
zdtStart.toString():2017-01-23T22:15-05:00 [美国/蒙特利尔]
zdtStop.toString():2017-01-24T01:15-05:00 [美国/蒙特利尔]
d.toString():PT3H
见ZoneId
。
America/Montreal
框架内置于Java 8及更高版本中。这些类取代了麻烦的旧Daylight Saving Time (DST)日期时间类,例如code run live at IdeOne.com,java.time和& legacy
现在位于java.util.Date
的Calendar
项目建议迁移到SimpleDateFormat
类。
要了解详情,请参阅Joda-Time。并搜索Stack Overflow以获取许多示例和解释。规范是maintenance mode。
从哪里获取java.time类?
Android项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如ThreeTenABP,How to use ThreeTenABP…,ThreeTen-Extra和Interval
。
答案 3 :(得分:0)
您可以使用 java.time.Duration
,它以 ISO-8601 standards 为模型,并作为 JSR-310 implementation 的一部分与 Java-8 一起引入。 Java-9 引入了一些更方便的方法。
演示:
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
从 Trail: Date Time 了解有关现代日期时间 API 的更多信息。