我即将编写一些简单的数学行,并希望确保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();
}
答案 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
方法。