Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.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 使用Joda Time计算一周中的第二天和时间_Java_Jodatime - Fatal编程技术网

Java 使用Joda Time计算一周中的第二天和时间

Java 使用Joda Time计算一周中的第二天和时间,java,jodatime,Java,Jodatime,我将要写一些简单的数学行,并希望确保没有一些简单的高级构造来完成这项工作 我有一个对象,它代表一周中的一天、一天中的一小时和一分钟。例如“星期三上午10:14” 我想计算下一次发生之前的毫秒数。例如,如果现在是星期四10:14,那么它将相当于6天的毫秒。这是因为星期三已经过去了,所以需要6天才能到达下一个星期三。如果现在是星期三10:13.0001,那将是999 在Joda Time中是否有一个高层次的构造,这样我就可以在一两行代码中完成这项工作,或者我是否需要自己进行计算(包括边缘案例,以包装

我将要写一些简单的数学行,并希望确保没有一些简单的高级构造来完成这项工作

我有一个对象,它代表一周中的一天、一天中的一小时和一分钟。例如“星期三上午10:14”

我想计算下一次发生之前的毫秒数。例如,如果现在是星期四10:14,那么它将相当于6天的毫秒。这是因为星期三已经过去了,所以需要6天才能到达下一个星期三。如果现在是星期三10:13.0001,那将是999

在Joda Time中是否有一个高层次的构造,这样我就可以在一两行代码中完成这项工作,或者我是否需要自己进行计算(包括边缘案例,以包装像DOW 谢谢

以下是我的新手尝试,它还不起作用,可以为您提供一些参考:

public MutableDateTime getDateTime() {
    MutableDateTime date = MutableDateTime.now();
    date.setDayOfWeek(this.day);
    date.setHourOfDay(this.hour);
    return date;
}

public long getTimeUntilNextFrom( DateTime from ) {
    MutableDateTime to = getDateTime();
    if (to.isBefore( from )) {
        to.setWeekOfWeekyear(from.getWeekOfWeekyear() + 1);
    }

    return new Interval(from, to).toDurationMillis();
}

我会这样做:

public class DistanceCalculator {
    public long getMillisecondTillNext(int dayOfWeek, int hourOfDay, int minuteOfHour) {
        DateTime now = DateTime.now();
        DateTime next = DateTime.now().withDayOfWeek(dayOfWeek).withHourOfDay(hourOfDay).withMinuteOfHour(minuteOfHour);
        long distance = next.getMillis() - now.getMillis();
        return distance > 0 ? distance : week() - distance;
    }

    private long week() {
        return new DateTime(0).plusWeeks(1).getMillis();
    }
}
import org.joda.time.DateTime;
import org.joda.time.DateTimeConstants;
import org.joda.time.Interval;
import org.joda.time.LocalTime;

public class Main {
    public static void main(String[] args) {
        Interval interval = betweenNowAndNext(DateTimeConstants.MONDAY, new LocalTime(10, 14));
        System.out.println(interval.toDurationMillis());
    }

    public static Interval betweenNowAndNext(int dayOfWeek, LocalTime time) {
        DateTime now = DateTime.now();
        DateTime closest = time.toDateTime(now).withDayOfWeek(dayOfWeek);
        return new Interval(now, closest.isBefore(now) ? closest.plusWeeks(1) : closest);
    }
}

还没有听说过任何现成的方法可以在Joda中实现这一点…

以下是我自己想到的。不过,如果有一个代码行更少的解决方案就好了。他们白天是我工作的班级。它包含一周中的一天和一天中的一小时

public class DayHour {
    int day;
    int hour;

    public DayHour(int day, int hour) {
        this.day = day;
        this.hour = hour;
    }

    public MutableDateTime getDateTime(DateTime base) {
        MutableDateTime date = base.toMutableDateTime();
        date.setDayOfWeek(this.day);
        date.setHourOfDay(this.hour);
        return date;
    }

    public long getTimeUntilNextFrom(DateTime from) {
        MutableDateTime to = getDateTime(from);
        if (to.isBefore(from)) {
            to.setWeekOfWeekyear(from.getWeekOfWeekyear() + 1);
        }

        return new Interval(from, to).toDurationMillis();
    }
}

@Test
public void testDayHour() {
    DateTime now = DateTime.now();
    DayHour date = new DayHour(now.getDayOfWeek(), now.getHourOfDay());

    MutableDateTime yesterday = now.toMutableDateTime();
    yesterday.addDays(-1);
    assertEquals(TimeUnit.DAYS.toMillis(1), date.getTimeUntilNextFrom(yesterday.toDateTime()));

    MutableDateTime tomorrow = now.toMutableDateTime();
    tomorrow.addDays(1);
    assertEquals(TimeUnit.DAYS.toMillis(6), date.getTimeUntilNextFrom(tomorrow.toDateTime()));
}

不太清楚你在做什么。但是如果您想要的是以毫秒为单位的倒计时,我将使用Joda Time类及其方法。乘以1000以报告大约毫秒。在最后一秒钟,如果您确实需要,请切换档位以使用
.getMillis
方法。

您可以执行以下操作:

public class DistanceCalculator {
    public long getMillisecondTillNext(int dayOfWeek, int hourOfDay, int minuteOfHour) {
        DateTime now = DateTime.now();
        DateTime next = DateTime.now().withDayOfWeek(dayOfWeek).withHourOfDay(hourOfDay).withMinuteOfHour(minuteOfHour);
        long distance = next.getMillis() - now.getMillis();
        return distance > 0 ? distance : week() - distance;
    }

    private long week() {
        return new DateTime(0).plusWeeks(1).getMillis();
    }
}
import org.joda.time.DateTime;
import org.joda.time.DateTimeConstants;
import org.joda.time.Interval;
import org.joda.time.LocalTime;

public class Main {
    public static void main(String[] args) {
        Interval interval = betweenNowAndNext(DateTimeConstants.MONDAY, new LocalTime(10, 14));
        System.out.println(interval.toDurationMillis());
    }

    public static Interval betweenNowAndNext(int dayOfWeek, LocalTime time) {
        DateTime now = DateTime.now();
        DateTime closest = time.toDateTime(now).withDayOfWeek(dayOfWeek);
        return new Interval(now, closest.isBefore(now) ? closest.plusWeeks(1) : closest);
    }
}

对不起,我听不懂你的逻辑;你能把规则说得更清楚些吗?在“星期三上午10:14”和“星期四上午10:14”之间,据我所知,只有一天的毫秒值得……我编辑了一下,让它更清楚。记住,这是一周中的每一天,每一周都在重复。因此,如果是星期四,我们没有时间机器将时间返回到星期三,我们必须计算到下一个星期三的时间。好的,那么它是指
DateTime.now()
?时区呢?参见示例。时区并不重要,因为它是单个JVM实例中的持续时间算法。@如果某个系统管理员或用户更改了机器的默认时区,或者同一JVM中的其他Java代码笨拙地更改了JVM的默认时区,则user1888440时区将起作用。更好的做法是总是指定你的时区。谢谢!你能告诉我你是否认为这比我试图回答我自己的问题要好?如果你不理解这个问题,为什么要添加一个答案?@user1888440(a)表明Joda Time确实有一些类用于计算日期时间之间的增量,以特定单位,例如秒。这似乎是问题和其他答案的目的。(b) 和其他人一样,指出你的问题写得不好,同时指出一种可能更好的表达方式。张贴的两个答案似乎完全理解这个问题(而且都是正确的),但感谢你的输入。在未来,我认为你会得到更好的结果,在评论中要求澄清而不是回答。这让海报有机会更准确地表达问题。