java - 如何仅从提供的小时数计算 Java 中的耗时

标签 java time calendar date

这有两个部分:首先计算开始日期。然后计算耗时。对于第二部分,我在这里找到了一些很好的建议: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/

相关文章:

java - OpenJPA 说 : You have supplied colums for FooBar but this mapping cannot have columns in this context

php - 如何在此代码 mysql php 中获取小时和分钟

java - android 中的不同时区

java - 如何在 Java 中从右侧减少有限的流(例如 ArrayList)?

java - 浮点运算的不同结果

d3.js:在轴上的刻度之间对齐文本标签

java - 使用日历,我如何发现相对日期?

java - 在 while 循环中更新 Calendar.SECOND

java - Logback SMTPAppender 限制速率

c++ - 标准库中是否有跨平台的头文件提供对当前时间的访问?