将两个 LocalTime 对象转换为 Duration 对象

Converting two LocalTime objects into a Duration object

Joda 是必须的,因为 JavaSE8 在此环境中不可用。

如何找到两个 LocalTime 对象之间的小时差异,并存储为 Duration?尝试了以下但没有成功:

LocalTime startTime = new LocalTime(8, 0);
LocalTime endTime = new LocalTime(16, 0);

Period shiftDuration = new Period(0, 
endTime.getHourOfDay() - startTime.getHourOfDay(), 0, 0);

System.out.println(shiftDuration.getHours()); // expected 8, get 0.

您在错误的参数中提供了值。试试这个:

LocalTime startTime = new LocalTime(8, 0);
    LocalTime endTime = new LocalTime(16, 0);

    Period shiftDuration = new Period(endTime.getHourOfDay() - startTime.getHourOfDay(), 0, 0, 0);

    System.out.println(shiftDuration.getHours());

根据JODA documentation

Period(int hours, int minutes, int seconds, int millis) 
          Create a period from a set of field values using the standard set of fields.

如果您特别想要这 2 个 LocalTime 实例之间的小时数,您可以使用 org.joda.time.Hours class:

LocalTime startTime = new LocalTime(8, 0);
LocalTime endTime = new LocalTime(16, 0);

int hours = Hours.hoursBetween(startTime, endTime).getHours();

结果将是 8

您也可以使用 org.joda.time.Period:

Period period = new Period(startTime, endTime);
System.out.println(period.getHours()); // 8

结果也是8.

它们之间的区别是 Hours 对值进行了四舍五入,而 Period 则没有。示例:

// difference between 08:00 and 16:30
LocalTime startTime = new LocalTime(8, 0);
LocalTime endTime = new LocalTime(16, 30);

Period period = new Period(startTime, endTime);
System.out.println(period); // PT8H30M
System.out.println(period.getHours()); // 8
System.out.println(period.getMinutes()); // 30

int hours = Hours.hoursBetween(startTime, endTime).getHours();
System.out.println(hours); // 8

虽然 Period 保留所有字段(8 小时 30 分钟),但 Hours 只关心小时数并丢弃其他字段。