这有两个部分:首先计算开始日期。然后计算耗时。对于第二部分,我在这里找到了一些很好的建议:Calculate elapsed time in Java / Groovy
但是,第一部分对我来说是个问题。它是这样工作的: 用户指示时间跨度从小时值(00 到 23)延伸。我没有任何类型的开始日期/时间对象——只有一个整数小时。从那我需要计算开始日期(然后是耗时)。
如果开始时间大于现在时间,则为前一天。但是,为了从中获得实际的开始日期,我可能需要考虑月份和年份的界限以及闰年和夏令时变化等因素。肯定有人已经解决了这样的问题。 (我相信它可能非常复杂。)是否有一个经过验证的解决方案可以让我计算从一天中的给定时间(00 到 24)到现在实际经过了多少时间(以秒为单位)? (开始时间将始终假定为整点。)
最佳答案
首先,我建议使用 Joda Time应用程序接口(interface)。在我看来,这是适用于 Java 的最佳日期/时间 API。
接下来,您需要确定确切在各种极端情况下该做什么。具体而言,假设用户输入“1”并且您接近夏令时转换。凌晨 1 点有可能发生两次(如果时间是 1:58、1:59、1:00、1:01 因为从 DST 返回的转换)或者它没有发生完全没有(如果时间是 12:58、12:59、2:00 因为向前过渡到 DST)。您需要弄清楚在每种情况下该怎么做 - 请记住,这也意味着要了解时区。
一旦你解决了这个问题,它可能不会太难。使用 Joda Time,您可以使用 withHourOfDay
方法从一个时间转到另一个时间,并设置时间的一个组成部分 - 同样,如果需要,也有简单的 API 用于添加或减去一天。然后,您可以非常轻松地计算出两个 DateTime
值之间的时间 - 同样,Joda Time 提供了您需要的一切。
这是一个示例,它不尝试对 DST 转换做任何事情,但它是一个很好的起点:
import org.joda.time.*;
public class Test
{
public static void main(String[] args)
{
// Defaults to current time and time zone
DateTime now = new DateTime();
int hour = Integer.parseInt(args[0]);
DateTime then = now
.withHourOfDay(hour)
.withMinuteOfHour(0)
.withSecondOfMinute(0);
if (then.isAfter(now))
{
then = then.minusDays(1);
}
Period period = new Period(then, now, PeriodType.seconds());
System.out.println("Difference in seconds: " + period.getSeconds());
}
}
关于java - 如何仅从提供的小时数计算 Java 中的耗时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4290664/