这有两个部分:首先计算开始日期。然后计算经过的时间。对于第二部分,我在这里找到了一些好建议:Calculate elapsed time in Java / Groovy
然而,第一部分对我来说是一个问题。以下是它的工作原理: 用户指示时间跨度从小时值(00到23)延伸。我没有任何类型的开始日期/时间对象 - 只是整数小时。从那里我需要计算开始日期(然后是经过的时间)。
如果开始时间大于现在的小时,那就是前一天。然而,为了从中获得实际的开始日期,我需要考虑月份和年份的界限以及闰年和夏令时变化等事项。当然有人已经解决了这样的问题。 (我相信它可能非常复杂。)是否有一个经过验证的解决方案可以让我计算从一天中给定的小时(00到24)到现在实际经过多少时间(以秒为单位)? (开始时间将始终假定为小时。)
答案 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);
}