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

时间:2014-03-26 17:19:17

标签: java jodatime

我即将编写一些简单的数学行,并希望确保Joda-Time中没有一些简单的高级构造来实现这一点。

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

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

在Joda-Time中是否有高级构造,所以我可以在一行或两行代码中执行此操作,或者我是否需要自己进行数学运算(包括边缘情况以包装DOW< DOW_NOW之类的东西)。

谢谢!

这是我的新手尝试,但还没有给你一些参考:

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

4 个答案:

答案 0 :(得分:1)

我会这样做:

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

Haven没有听说任何现成的方法在Joda中得到这个......

答案 1 :(得分:1)

你可以这样做:

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

答案 2 :(得分:0)

这是我自己想出来的。不过,用更少的代码行来获得解决方案会更好。他们DayHour是我正在上课的。它包含一周中的一天和一天中的一小时。

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

答案 3 :(得分:0)

不太确定你在做什么。但是如果您想要的是以毫秒为单位的倒计时,我会使用Joda-Time Seconds类及其secondsBetween方法。乘以1,000报告大约毫秒。在最后一秒,如果您确实需要,请切换齿轮以使用.getMillis方法。