如何在Java中仅从提供的小时数计算已用时间

ha5z0ras  于 2023-01-11  发布在  Java
关注(0)|答案(4)|浏览(119)

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

inb24sb2

inb24sb21#

首先,我建议使用Joda Time API,在我看来,它是Java可用的最好的日期/时间API。
接下来,你需要计算出在各种极端情况下应该做什么。特别是,假设用户输入“1”,而你正在进行夏令时转换。1am可能发生了两次(如果时间从夏令时向后转换到1:58、1:59、1:00、1:01),或者根本没有发生(如果时间从夏令时向前转换到12:58、12:59、2:00)。你需要计算出在每种情况下应该做什么--记住,这意味着你也知道时区。
一旦你解决了这个问题,它可能不会太难。使用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());
    }
}
7kqas0il

7kqas0il2#

Java.时间

accepted answer提供了一个使用Joda-Time API的解决方案,Joda-Time API可能是当时Java中最好的第三方日期时间API。2014年3月,modern date-time API作为Java 8标准库的一部分发布。请注意Home Page of Joda-Time上的以下消息:
Joda-Time是Java SE 8之前的Java事实上的标准日期和时间库。现在要求用户迁移到java.time(JSR-310)。

使用java.time(现代日期-时间API)的解决方案

import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.temporal.ChronoUnit;

class Main {
    public static void main(String[] args) {
        // A sample hour indicated by the user
        int hour = 16;

        // Replace the ZoneId with the applicable one
        ZoneId zone = ZoneId.of("America/New_York");
        ZonedDateTime then = LocalDate.now(zone)
                                      .atStartOfDay(zone)
                                      .withHour(hour);

        ZonedDateTime now = ZonedDateTime.now(zone);
        System.out.println(now);

        if (then.isAfter(now))
            then = then.minusDays(1).withHour(hour);

        long seconds = ChronoUnit.SECONDS.between(then, now);
        System.out.println(seconds);
    }
}

示例运行的输出

2023-01-08T09:31:28.040819-05:00[America/New_York]
63088

ONLINE DEMO
从**Trail: Date Time**了解有关现代日期-时间API的更多信息。

pxiryf3j

pxiryf3j3#

假设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);
pokxtpni

pokxtpni4#

使用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);
}

相关问题