如何仅从提供的小时计算Java中的经过时间

时间:2010-11-27 08:00:19

标签: java time calendar date

这有两个部分:首先计算开始日期。然后计算经过的时间。对于第二部分,我在这里找到了一些好建议:Calculate elapsed time in Java / Groovy

然而,第一部分对我来说是一个问题。以下是它的工作原理: 用户指示时间跨度从小时值(00到23)延伸。我没有任何类型的开始日期/时间对象 - 只是整数小时。从那里我需要计算开始日期(然后是经过的时间)。

如果开始时间大于现在的小时,那就是前一天。然而,为了从中获得实际的开始日期,我需要考虑月份和年份的界限以及闰年和夏令时变化等事项。当然有人已经解决了这样的问题。 (我相信它可能非常复杂。)是否有一个经过验证的解决方案可以让我计算从一天中给定的小时(00到24)到现在实际经过多少时间(以秒为单位)? (开始时间将始终假定为小时。)

3 个答案:

答案 0 :(得分:4)

首先,我建议使用Joda Time API。在我看来,这是Java可用的最佳日期/时间API。

接下来,您需要完成 在各种角落情况下要做的事情。特别是,假设用户输入“1”并且您接近夏令时转换。可能凌晨1点发生了两次(如果时间是1:58,1:59,1:00,因为从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());
    }
}

答案 1 :(得分:1)

假设startHour由用户给出(假设,它在0-23范围内)。现在你可以从这开始:

import java.util.Calendar;
import static java.util.Calendar.*;
...
Calendar start = Calendar.getInstance();
if (start.get(HOUR_OF_DAY) < startHour) {
start.add(DAY_OF_MONTH, -1);

答案 2 :(得分:1)

使用Joda-Time课程。你可以这样做:

DateTime now = new DateTime();
DateTime start;
int startHour = getStartHour();// user's choice
int nowHour = now.getHourOfDay();
if (nowHour < startHour) {
  start = now.minusHours(24 - startHour + nowHour);
} else {
  start = now.minusHours(nowHour - startHour);
}