Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中仅从提供的小时计算弹性时间_Java_Time_Calendar_Date - Fatal编程技术网

如何在Java中仅从提供的小时计算弹性时间

如何在Java中仅从提供的小时计算弹性时间,java,time,calendar,date,Java,Time,Calendar,Date,这有两个部分:首先计算开始日期。然后计算经过的时间。对于第二部分,我在这里找到了一些好的建议: 然而,第一部分对我来说是个问题。下面是它的工作原理: 用户指示时间跨度从小时值00扩展到23。我没有任何类型的起始日期/时间对象-只有整数小时。从这开始,我需要计算开始日期,然后是经过的时间 如果开始时间大于当前时间,则为前一天。然而,为了从中获得一个实际的开始日期,我需要潜在地考虑月和年边界以及闰年和夏时制时间变化之类的事情。肯定有人已经解决了这样的问题。我相信这可能相当复杂。是否有一个经过验证的解

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

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


如果开始时间大于当前时间,则为前一天。然而,为了从中获得一个实际的开始日期,我需要潜在地考虑月和年边界以及闰年和夏时制时间变化之类的事情。肯定有人已经解决了这样的问题。我相信这可能相当复杂。是否有一个经过验证的解决方案,可以让我计算从一天中的给定时间00到24到现在实际经过了多少秒?开始时间总是假定为小时。

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

接下来,您需要准确地了解在各种情况下应该做什么。特别是,假设用户输入1,而您接近夏时制转换。如果由于从DST向后过渡,时间变为1:58、1:59、1:00、1:01,则可能会发生两次凌晨1点;如果时间变为12:58、12:59、2:00,则可能根本不会发生凌晨1点,因为向前过渡到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());
    }
}

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

接下来,您需要准确地了解在各种情况下应该做什么。特别是,假设用户输入1,而您接近夏时制转换。如果由于从DST向后过渡,时间变为1:58、1:59、1:00、1:01,则可能会发生两次凌晨1点;如果时间变为12:58、12:59、2:00,则可能根本不会发生凌晨1点,因为向前过渡到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());
    }
}
假设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);
假设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);
使用类。您可以这样做:

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);
}
使用类。您可以这样做:

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

Joda Time++:他们正在考虑将JSR放在JDK 7中@Mohamed:JSR310与Joda Time有些不同,尽管他们有相同的主要作者。抱歉:x Stephen在他的博客中解释了为什么他在JSR310中使用javax.Time.Duration类,并且可以使用更新的日历和日期类,非常酷:Joda Time++:他们正在考虑将JSR放在JDK 7中@Mohamed:JSR310与Joda Time有些不同,尽管它们有相同的主要作者。抱歉:x Stephen在他的博客中解释了为什么JSR310都使用javax.Time.Duration类,并且可以使用更新的日历和日期类,非常酷: